質問編集履歴

1 データベースのカラムへの言及を追加

valval

valval score 16

2018/07/29 19:39  投稿

php7.1のpassword_hash関数に入れる引数が同じなのに、戻り値の結果が異なる
お世話になります。
### 前提・実現したいこと
Webアプリの利用者が登録したメールアドレスが、本当に利用者が使っているメールアドレスか確認する為に、メールに認証キーを書いて送付し、その値をフォームに入力させ、本人のメールアドレスであると確認したいです。
### 発生している問題・エラーメッセージ
認証キーを送るメールを作った段階で、データベースにpassword_hash関数でキーをハッシュ化させた文字列を格納し、利用者がフォームに入れた認証キーも同関数でハッシュ化させ、二つの文字列を比較したのですが、同じ値をpassword_hashしたのに、結果が異なっています。
### 該当のソースコード
認証キーの発行とサーバーへの登録は、下記の通りです。
```php
//メールアドレスをフォームから取得
$mail=$_POST["mail"];
session_start();
//データベースの設定
require "dbAccessLib.php";
//return_db関数の中ではmysqli_connectを行う
$link= return_db();
//5桁の乱数を認証キーとする
$rand=rand(10000, 99999);
//キーを文字列化       
$key="".$rand;
//キーをハッシュ化       
$haskey=password_hash($key,PASSWORD_DEFAULT);
//メールアドレスとキーを紐づけたデータを、データベースへ格納
$sql="INSERT mailAndKey(Mail,ActivateKey) VALUES('".$mail."','".$haskey."')";
if ($result2 = mysqli_query($link, $sql))
{
//格納が成功
print("仮使用を開始しました。<br>");
print("登録しましたメールアドレスへ、認証キーを記載したメールを送付しました。<br>");
print("このブラウザを閉じずに、仮設立後15分以内に、下記テキストボックスへ、<br>");
print("送付された認証キーを入力し、認証ボタンを押して下さい。");
//セッションにメールアドレスを格納                       
$_SESSION['mail']=$mail;
   
$MailBody=$MailBody."認証キー:".$key;
mb_send_mail($mail,"認証キー送付",$MailBody);
}
```
認証キーの入力の取得と比較は、下記の通りです。
```php
//入力された認証キーを取得
$input=$_POST['ninsyou'];
//認証キーをハッシュ化
$hasinput=password_hash($input,PASSWORD_DEFAULT);
//データベースに接続
require "dbAccessLib.php";
$link= return_db();
//セッションからメールアドレスを取得
$mail = $_SESSION['mail'];
   
//メールアドレスから、データベースに登録されたハッシュ化されている認証キーを取るSQL
$sql="SELECT ActivateKey FROM mailAndKey WHERE Mail ='".$mail."'";
if ($result = mysqli_query($link, $sql))
{
//取得成功
$row = mysqli_fetch_assoc($result);
$getresult=$row['ActivateKey'];
//データベースからの取得結果と入力したキーのハッシュ化を表示
print("<br>result:".$getresult);
print("<br>input :".$hasinput);
//両者を比較
if(strcmp($row['ActivateKey'],$hasinput)==0)
{
print("<br>認証に成功しました。");
}
else
{
print("<br>認証に失敗しました。");
}
}
mysqli_close($link);
```
なお、データベース上でのカラムActivateKeyの型は、char(255)です。
宜しくお願い致します。
  • PHP

    24089 questions

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

  • MySQL

    7007 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る