下記のソースにて前頁から送られてきたパスワードとDBに存在する既にハッシュ化されたパスワードを照合しています。
しかし、前頁から、ハッシュ化されたパスワードに対応する値を下記のソースに送信しているのにも関わらず照合が一致せず次の処理に進まないのです。
もちろんですが、DBに存在するパスワードをハッシュ化しなければ、前頁で記述したパスワードは一致します。なぜハッシュ化した途端上手くいかなくなるのでしょうか。
php
1<?php 2try { 3 require_once '../lib/dbaccess.php'; 4 require_once '../common/common.php'; 5 6 $post = sanitize($_POST); 7 $member_email = $post['email']; 8 $member_pass = $post['pass']; 9 10 $dbh = dbaccess(); 11 $sql = 'SELECT code,password,name,email FROM dat_member WHERE email=?'; 12 $stmt = $dbh->prepare($sql); 13 $data[] = $member_email; 14 $stmt->execute($data); 15 16 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 17 $db_pass = $rec['password']; 18 if(!password_verify($member_pass, $db_pass)) { 19 echo <<<EOL 20 <p>パスワードが間違っています。</p> 21 <a href="./member_login.html">戻る</a> 22 EOL; 23 } else { 24 session_start(); 25 $_SESSION['member_login'] = 1; 26 $_SESSION['member_code'] = $rec['code']; 27 $_SESSION['member_name'] = $rec['name']; 28 header('Location: ./shop_list.php'); 29 } 30 $dbh = null; 31 32 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 33 } catch(Exception $e) { 34 echo <<<EOL 35ただいま障害により大変ご迷惑をおかけしております。 36EOL; 37 exit(); 38 } 39 ?>
@common.php
php
1 <?php 2 function sanitize($before) { 3 foreach($before as $key => $value) { 4 $after[$key] = htmlspecialchars($value); 5 } 6 return $after; 7 };
@前頁
html
1<!DOCTYPE html> 2 <html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=divise-width, initial-scale=1, user-scalable=1"> 6 </head> 7 <body> 8 <h1>会員ログイン</h1> 9 <form method="post" action="./member_login_check.php"> 10 <label><p>登録メールアドレス</p><input type="text" name="email"></label> 11 <label><p>パスワード</p><input type="password" name="pass"></label> 12 <input type="submit" value="送信"> 13 </form> 14 </body> 15 </html>
@パスワードをハッシュ化しDBに保存するときのソース
php
1<中略> 2if($chumon == 'chumontouroku') { 3 $sql = 'insert into dat_member (password,name,email,postal1,postal2,address,tel,danjo,born) values(?,?,?,?,?,?,?,?,?)'; 4 $stmt = $dbh->prepare($sql); 5 $data = array(); 6 7 function password($password) { 8 $options = array('cost' => 10); 9 return $reg_pass = password_hash($password, PASSWORD_DEFAULT, $options); 10 } 11 12 $reg_pass = password($reg_pass); 13 $data[] = $reg_pass; 14 $data[] = $onamae; 15 $data[] = $email; 16 $data[] = $postal1; 17 $data[] = $postal2; 18 $data[] = $address; 19 $data[] = $tel; 20 if($danjo == 'dan') { 21 $data[] = 1; 22 } else { 23 $data[] = 2; 24 } 25 $data[] = $birth; 26 $stmt->execute($data); 27 <中略>
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12153369172

回答3件
あなたの回答
tips
プレビュー