質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

333閲覧

php7.1のpassword_hash関数に入れる引数が同じなのに、戻り値の結果が異なる

valval

総合スコア43

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/07/29 10:34

編集2018/07/29 10:39

お世話になります。

前提・実現したいこと

Webアプリの利用者が登録したメールアドレスが、本当に利用者が使っているメールアドレスか確認する為に、メールに認証キーを書いて送付し、その値をフォームに入力させ、本人のメールアドレスであると確認したいです。

発生している問題・エラーメッセージ

認証キーを送るメールを作った段階で、データベースにpassword_hash関数でキーをハッシュ化させた文字列を格納し、利用者がフォームに入れた認証キーも同関数でハッシュ化させ、二つの文字列を比較したのですが、同じ値をpassword_hashしたのに、結果が異なっています。

該当のソースコード

認証キーの発行とサーバーへの登録は、下記の通りです。

php

1//メールアドレスをフォームから取得 2$mail=$_POST["mail"]; 3session_start(); 4//データベースの設定 5require "dbAccessLib.php"; 6//return_db関数の中ではmysqli_connectを行う 7$link= return_db(); 8//5桁の乱数を認証キーとする 9$rand=rand(10000, 99999); 10//キーを文字列化 11$key="".$rand; 12//キーをハッシュ化 13$haskey=password_hash($key,PASSWORD_DEFAULT); 14//メールアドレスとキーを紐づけたデータを、データベースへ格納 15$sql="INSERT mailAndKey(Mail,ActivateKey) VALUES('".$mail."','".$haskey."')"; 16 17if ($result2 = mysqli_query($link, $sql)) 18{ 19//格納が成功 20print("仮使用を開始しました。<br>"); 21print("登録しましたメールアドレスへ、認証キーを記載したメールを送付しました。<br>"); 22print("このブラウザを閉じずに、仮設立後15分以内に、下記テキストボックスへ、<br>"); 23print("送付された認証キーを入力し、認証ボタンを押して下さい。"); 24 25//セッションにメールアドレスを格納 26$_SESSION['mail']=$mail; 27 28$MailBody=$MailBody."認証キー:".$key; 29mb_send_mail($mail,"認証キー送付",$MailBody); 30}

認証キーの入力の取得と比較は、下記の通りです。

php

1//入力された認証キーを取得 2$input=$_POST['ninsyou']; 3//認証キーをハッシュ化 4$hasinput=password_hash($input,PASSWORD_DEFAULT); 5//データベースに接続 6require "dbAccessLib.php"; 7$link= return_db(); 8//セッションからメールアドレスを取得 9$mail = $_SESSION['mail']; 10 11//メールアドレスから、データベースに登録されたハッシュ化されている認証キーを取るSQL 12$sql="SELECT ActivateKey FROM mailAndKey WHERE Mail ='".$mail."'"; 13if ($result = mysqli_query($link, $sql)) 14{ 15//取得成功 16$row = mysqli_fetch_assoc($result); 17$getresult=$row['ActivateKey']; 18//データベースからの取得結果と入力したキーのハッシュ化を表示 19print("<br>result:".$getresult); 20print("<br>input :".$hasinput); 21//両者を比較 22if(strcmp($row['ActivateKey'],$hasinput)==0) 23{ 24print("<br>認証に成功しました。"); 25} 26else 27{ 28print("<br>認証に失敗しました。"); 29} 30} 31mysqli_close($link);

なお、データベース上でのカラムActivateKeyの型は、char(255)です。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ちゃんと見てないですけど、多分 password_hash() の利用方法が間違っています。
検証は、password_verify() を使用します。
マニュアルを再確認してみてください。

投稿2018/07/29 10:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

valval

2018/07/29 11:13

おっしゃる通り、password_verifyで認証が通りました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/07/29 11:55

中身を確認しましたが、セキュリティ的にかなりマズイ実装が入っています。 ・SQLインジェクションが可能 ・暗号学的にセキュアでない関数による $key の作成 ・入力値検証がない 等々。試してないですが、多分、他人のメールアドレスで、登録することが可能です。 こういった機能は、安全とされているライブラリを探して使用することをオススメします。
valval

2018/07/29 12:00

わかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問