PHPの学習で簡易サイトのログインフォームを作成しているのですが、お聞きしたいことがございます。
php
1<?php 2 session_start();//セッション開始 3 if(isset($_SESSION['id'])){ 4 header('Location:index.php'); 5 6 }else if(isset($_POST['name']) && isset($_POAT['password'])){ 7 //ログインしていないが、ユーザ名とパスワードが送信された時 8 //データベース接続 9 $dsn = 'mysql:host=localhost;dbname=tennis;charset=utf8'; 10 $user = 'root'; 11 $password = ''; 12 13 try{ 14 $dbh = new PDO($dsn,$user,$password); 15 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 16 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 17 $stmt = $dbh->prepare(" 18 SELECT * FROM users WHERE name = :name AND password=:pass 19 "); 20 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 21 $stmt->bindValue(':pass',sha1($_POST['password'],PDO::PARAM_STR)); 22 $stmt->execute(); 23 if($row = $stmt->fetch()){ 24 $_SESSION['id'] = $row['id']; 25 header('Location: index.php'); 26 exit(); 27 } 28 29 }catch(PDOEception $e){ 30 die('エラー:' . $e->getMessage()); 31 } 32 33 }else{ 34 35?> 36 37<html> 38 <head> 39 <meta charset="utf-8"> 40 <title>テニスサークル交流サイト</title> 41 </head> 42 <body> 43 <h1>テニスサークル交流サイト</h1> 44 <h2>ログイン</h2> 45 <form action="login.php" method="post"> 46 <p>ユーザ名:<input type="text" name="name"></p> 47 <p>パスワード:<input type="password" name="password"></p> 48 <p><input type="submit" value="ログイン"></p> 49 </form> 50 </body> 51</html> 52 53<?php } ?>
上記コードはアクセスした際に、セッションを保持していない場合、ユーザーIDとパスワードをデータベースで照合し、データベースに存在していれば、index.phpへ、そうでなければ、ログインフォーム画面を表示するコードとなっております。
以下はデータベースにて、照合を行うテーブルの画像になります。
テストデータとして、3人のデータをコマンドプロンプトより、追加しました。
3人のデータを追加した際のsqlが以下になります。
sql
1MariaDB [online_bbs]> INSERT INTO users (name,password) VALUES 2 -> ('yamada',sha1('yamadapass')), 3 -> ('tanaka',sha1('tanakapass')), 4 -> ('kikuchi',sha1('kikuchipass')); 5
パスワードをテーブルに追加する際は「sha1」関数を通しています。
分からない部分といいますのは、「$stmt->bindValue(':pass',sha1($_POST['password'],PDO::PARAM_STR));」ここの部分なのですが、パスワードをテーブルよりSELECTして持ってくる際に、POSTされたパスワードを暗号化し、最終的には、暗号化されたパスワードがSELECTされるかどうかを判別しています。しかし、入力されたパスワードをハッシュ化した値が、誰が入力しても同じになってしまった場合、暗号化する意味がないように思えます。
データベースに登録する際ユーザのパスワードを暗号化するのは理解できるのですが、データベースと照合する場合に関しては、そもそもハッシュ化する値が、データベースに登録した際の値と毎回同じになってしまっていたら、暗号化の意味もないような気がしてしまいます。
上記の点につきまして、どなたかご解説頂けましたら幸いです。よろしくお願いします。

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