会員登録のページを作成しましたが、セキュリティの部分で書き直したい箇所があります。
データベースにパスワードを登録する際にセキュリティの面で [sha1]はマニュアルでは推奨されていないので[password_hash]を使ってパスワードをハッシュ化することができました。(chech.php)
ですが、ログインの認証時に[password_verify]でハッシュ化されたパスワードの第二引数(login.php)をどのように書けばいいのかわかりません。
PHPの教材を購入してこのコードを書いてみましたので、コードが汚く読みにくいかもしれませんがもしよろしければ教えていただきたいです。
よろしくお願いします。
loginphp
1<?php 2require('../dbconnect.php'); 3session_start(); 4error_reporting(E_ALL ^ E_NOTICE); 5 6if ($_COOKIE['email'] != '') { 7 $_POST['email'] = $_COOKIE['email']; 8 $_POST['password'] = $_COOKIE['password']; 9 $_POST['save'] = 'on'; 10} 11 12if (!empty($_POST)) { 13 if ($_POST['email'] != '' && $_POST['password'] != '') { 14 $login = $db->prepare('SELECT * FROM members WHERE email=? AND password=?'); 15 $login->execute(array( 16 $_POST['email'], 17 password_verify($_POST['passowrd'], ) 18 )); 19 $member = $login->fetch(); 20 password_verify($_POST['password'], $member['password']); 21 22 if ($member) { 23 $_SESSION['id'] = $member['id']; 24 $_SESSION['time'] = time(); 25 26 if ($_POST['save'] == 'on') { 27 setcookie('email', $_POST['email'], time()+60*60*24*14); 28 setcookie('password', $_POST['password'], time()+60*60*24*14); 29 } 30 31 header('Location:index.php');exit(); 32 } else { 33 $error['login'] = 'failed'; 34 } 35 } else { 36 $error['login'] = 'blank'; 37 } 38} 39 40?> 41 42<div class="lead"> 43 <p>メールアドレスとパスワードを記入してログインしてください</p> 44 <p>入会手続きがまだな方はコチラからどうぞ</p> 45 <p>»<a href="../join/index.php">入会手続きをする</a></p> 46</div> 47<form action="" method="post"> 48 <dl> 49 <dt>メールアドレス</dt> 50 <dd> 51 <input type="text" name="email" size="35" maxlength="255" value="<?php echo h($_POST['email']); ?>"> 52 <?php if ($error['login'] == 'blank'): ?> 53 <p class="error">※メールアドレスとパスワードを入力して下さい</p> 54 <?php endif; ?> 55 <?php if ($error['login'] == 'failed'): ?> 56 <p class="error">※ログインに失敗しました。正しくご入力ください。</p> 57 <?php endif; ?> 58 </dd> 59 <dt>パスワード</dt> 60 <dd> 61 <input type="password" name="password" size="35" maxlength="255" value="<?php echo h($_POST['password']); ?>"> 62 </dd> 63 <dt>ログイン情報の記録</dt> 64 <dd> 65 <input id="save" type="checkbox" name="save" value="on"><label for="save">次回からは自動的にログインする</label> 66 </dd> 67 </dl> 68 <div><input type="submit" value="ログインする"></div> 69</form>
checkphp
1<?php 2session_start(); 3require('../dbconnect.php'); 4 5if (!isset($_SESSION['join'])) { 6 header('Location: index.php'); 7 exit(); 8} 9 10if (!empty($_POST)) { 11 $stmt = $db->prepare('INSERT INTO members SET name=?, email=?, password=?, picture=?, created=NOW()'); 12 echo $ret = $stmt->execute(array( 13 $_SESSION['join']['name'], 14 $_SESSION['join']['email'], 15 password_hash($_SESSION['join']['password'],PASSWORD_DEFAULT), 16 $_SESSION['join']['image'] 17 )); 18 unset($_SESSION['join']); 19 20 header('Location: thanks.php'); 21 exit(); 22} 23?> 24 25<form action="" method="post"> 26 <input type="hidden" name="action" value="submit"> 27 <dl> 28 <dt>ニックネーム</dt> 29 <dd> 30 <?php echo h($_SESSION['join']['name']); ?> 31 </dd> 32 <dt>メールアドレス</dt> 33 <dd> 34 <?php echo h($_SESSION['join']['email']); ?> 35 </dd> 36 <dt>パスワード</dt> 37 <dd> 38 【表示されません】 39 </dd> 40 <dt>写真など</dt> 41 <dd> 42 <img src="../post/member_picture/<?php echo h($_SESSION['join']['image']); ?>" width="300" height="300" alt=""> 43 </dd> 44 </dl> 45 <div><a href="index.php?action=rewrite">« 書き直す</a> | 46 <input type="submit" value="登録する"></div> 47</form>
dbconnectphp
1<?php 2try { 3 $db = new PDO ('mysql:dbname=mini_bbs;host=localhost;charset=utf8', 'root', 'root'); 4} catch (PDOException $e) { 5 echo 'DB接続エラー: ' . $e->getMessage(); 6} 7 8function h($value) { 9 return htmlspecialchars($value, ENT_QUOTES); 10} 11 12function makeLink($value) { 13 return mb_ereg_replace("(https?)(://[[:alnum:]+$\;?.%,!#~*/:@&=_-]+)",'<a href="\1\2">\1\2</a>', $value); 14} 15 16?> 17
indexphp
1<?php 2require('../dbconnect.php'); 3 4session_start(); 5error_reporting(E_ALL ^ E_NOTICE); 6 7if (!empty($_POST)) { 8 if ($_POST['name'] == '') { 9 $error['name'] = 'blank'; 10 } 11 if ($_POST['email'] == '') { 12 $error['email'] = 'blank'; 13 } 14 if (strlen($_POST['password']) < 4) { 15 $error['password'] = 'length'; 16 } 17 if ($_POST['password'] == '') { 18 $error['password'] = 'blank'; 19 } 20 21 $fileName = $_FILES['image']['name']; 22 if (!empty($fileName)) { 23 $ext = substr($fileName, -3); 24 if ($ext != 'jpg' && $ext != 'gif') { 25 $error['image'] = 'type'; 26 } 27 } 28 29 if (empty($error)) { 30 $member = $db->prepare('SELECT COUNT(*) AS cnt FROM members WHERE email=?'); 31 $member->execute(array($_POST['email'])); 32 $record = $member->fetch(); 33 if ($record['cnt'] > 0) { 34 $error['email'] = 'duplicate'; 35 } 36 } 37 38 if (empty($error)) { 39 $image = date('YmdHis') . $_FILES['image']['name']; 40 move_uploaded_file($_FILES['image']['tmp_name'], '../post/member_picture/' . $image); 41 42 $_SESSION['join'] = $_POST; 43 $_SESSION['join']['image'] = $image; 44 header('Location: check.php'); 45 exit(); 46 } 47 48 if ($_REQUSET['action'] == 'rewrite') { 49 $_POST = $_SESSION['join']; 50 $error['rewite'] = true; 51 } 52} 53 54?> 55 56 57<p>次のフォームに必要事項を記入してください。</p> 58<form action="" method="post" enctype="multipart/form-data"> 59 <dl> 60 <dt>ニックネーム<span class="required">必須</span></dt> 61 <dd><input type="text" name="name" size="35" maxlength="255" value="<?php echo h($_POST['name']); ?>"> 62 <?php if ($error['name'] == 'blank'): ?> 63 <p class="error">※ニックネームを入力してください</p> 64 <?php endif; ?> 65 </dd> 66 67 <dt>メールアドレス<span class="required">必須</span></dt> 68 <dd><input type="text" name="email" size="35" maxlength="255" value="<?php echo h($_POST['email']); ?>"> 69 <?php if ($error['email'] == 'blank'): ?> 70 <p class="error">※メールアドレスを入力してください</p> 71 <?php endif; ?> 72 <?php if ($error['email'] == 'duplicate'): ?> 73 <p class="error">※指定したメールアドレスは既に登録されています</p> 74 <?php endif; ?> 75 </dd> 76 77 <dt>パスワード<span class="required">必須</span></dt> 78 <dd><input type="password" name="password" size="10" maxlength="20"> 79 <?php if ($error['password'] == 'blank'): ?> 80 <p class="error">※パスワードを入力してください</p> 81 <?php endif; ?> 82 <?php if ($error['password'] == 'length'): ?> 83 <p class="error">※パスワードは4文字以上で入力してください</p> 84 <?php endif; ?> 85 </dd> 86 87 <dt>写真など</dt> 88 <dd><input type="file" name="image" size="35"/> 89 <?php if ($error['image'] == 'type'): ?> 90 <p class="error">※写真などは[.gif]または[.jpg]の画像を指定してください</p> 91 <?php endif; ?> 92 <?php if (!empty($error)): ?> 93 <p class="error">恐れ入りますが、画像を改めて指定してください</p> 94 <?php endif; ?> 95 </dd> 96 </dl> 97 <div><input type="submit" value="入力内容を確認する"></div> 98</form>
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/30 23:11
2021/07/30 23:14
2021/07/30 23:18
2021/07/30 23:20
2021/07/31 00:55