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

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

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

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

解決済

ログイン認証ページでのセキュリティ

suke1001
suke1001

総合スコア7

PHP

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

3回答

0評価

1クリップ

351閲覧

投稿2021/07/30 21:47

編集2021/07/30 21:58

会員登録のページを作成しましたが、セキュリティの部分で書き直したい箇所があります。

データベースにパスワードを登録する際にセキュリティの面で [sha1]はマニュアルでは推奨されていないので[password_hash]を使ってパスワードをハッシュ化することができました。(chech.php)

ですが、ログインの認証時に[password_verify]でハッシュ化されたパスワードの第二引数(login.php)をどのように書けばいいのかわかりません。

PHPの教材を購入してこのコードを書いてみましたので、コードが汚く読みにくいかもしれませんがもしよろしければ教えていただきたいです。

よろしくお願いします。

loginphp

<?php require('../dbconnect.php'); session_start(); error_reporting(E_ALL ^ E_NOTICE); if ($_COOKIE['email'] != '') { $_POST['email'] = $_COOKIE['email']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if (!empty($_POST)) { if ($_POST['email'] != '' && $_POST['password'] != '') { $login = $db->prepare('SELECT * FROM members WHERE email=? AND password=?'); $login->execute(array( $_POST['email'], password_verify($_POST['passowrd'], ) )); $member = $login->fetch(); password_verify($_POST['password'], $member['password']); if ($member) { $_SESSION['id'] = $member['id']; $_SESSION['time'] = time(); if ($_POST['save'] == 'on') { setcookie('email', $_POST['email'], time()+60*60*24*14); setcookie('password', $_POST['password'], time()+60*60*24*14); } header('Location:index.php');exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?> <div class="lead"> <p>メールアドレスとパスワードを記入してログインしてください</p> <p>入会手続きがまだな方はコチラからどうぞ</p> <p>&raquo;<a href="../join/index.php">入会手続きをする</a></p> </div> <form action="" method="post"> <dl> <dt>メールアドレス</dt> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php echo h($_POST['email']); ?>"> <?php if ($error['login'] == 'blank'): ?> <p class="error">※メールアドレスとパスワードを入力して下さい</p> <?php endif; ?> <?php if ($error['login'] == 'failed'): ?> <p class="error">※ログインに失敗しました。正しくご入力ください。</p> <?php endif; ?> </dd> <dt>パスワード</dt> <dd> <input type="password" name="password" size="35" maxlength="255" value="<?php echo h($_POST['password']); ?>"> </dd> <dt>ログイン情報の記録</dt> <dd> <input id="save" type="checkbox" name="save" value="on"><label for="save">次回からは自動的にログインする</label> </dd> </dl> <div><input type="submit" value="ログインする"></div> </form>

checkphp

<?php session_start(); require('../dbconnect.php'); if (!isset($_SESSION['join'])) { header('Location: index.php'); exit(); } if (!empty($_POST)) { $stmt = $db->prepare('INSERT INTO members SET name=?, email=?, password=?, picture=?, created=NOW()'); echo $ret = $stmt->execute(array( $_SESSION['join']['name'], $_SESSION['join']['email'], password_hash($_SESSION['join']['password'],PASSWORD_DEFAULT), $_SESSION['join']['image'] )); unset($_SESSION['join']); header('Location: thanks.php'); exit(); } ?> <form action="" method="post"> <input type="hidden" name="action" value="submit"> <dl> <dt>ニックネーム</dt> <dd> <?php echo h($_SESSION['join']['name']); ?> </dd> <dt>メールアドレス</dt> <dd> <?php echo h($_SESSION['join']['email']); ?> </dd> <dt>パスワード</dt> <dd> 【表示されません】 </dd> <dt>写真など</dt> <dd> <img src="../post/member_picture/<?php echo h($_SESSION['join']['image']); ?>" width="300" height="300" alt=""> </dd> </dl> <div><a href="index.php?action=rewrite">&laquo;&nbsp; 書き直す</a> | <input type="submit" value="登録する"></div> </form>

dbconnectphp

<?php try { $db = new PDO ('mysql:dbname=mini_bbs;host=localhost;charset=utf8', 'root', 'root'); } catch (PDOException $e) { echo 'DB接続エラー: ' . $e->getMessage(); } function h($value) { return htmlspecialchars($value, ENT_QUOTES); } function makeLink($value) { return mb_ereg_replace("(https?)(://[[:alnum:]+$\;?.%,!#~*/:@&=_-]+)",'<a href="\1\2">\1\2</a>', $value); } ?>

indexphp

<?php require('../dbconnect.php'); session_start(); error_reporting(E_ALL ^ E_NOTICE); if (!empty($_POST)) { if ($_POST['name'] == '') { $error['name'] = 'blank'; } if ($_POST['email'] == '') { $error['email'] = 'blank'; } if (strlen($_POST['password']) < 4) { $error['password'] = 'length'; } if ($_POST['password'] == '') { $error['password'] = 'blank'; } $fileName = $_FILES['image']['name']; if (!empty($fileName)) { $ext = substr($fileName, -3); if ($ext != 'jpg' && $ext != 'gif') { $error['image'] = 'type'; } } if (empty($error)) { $member = $db->prepare('SELECT COUNT(*) AS cnt FROM members WHERE email=?'); $member->execute(array($_POST['email'])); $record = $member->fetch(); if ($record['cnt'] > 0) { $error['email'] = 'duplicate'; } } if (empty($error)) { $image = date('YmdHis') . $_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], '../post/member_picture/' . $image); $_SESSION['join'] = $_POST; $_SESSION['join']['image'] = $image; header('Location: check.php'); exit(); } if ($_REQUSET['action'] == 'rewrite') { $_POST = $_SESSION['join']; $error['rewite'] = true; } } ?> <p>次のフォームに必要事項を記入してください。</p> <form action="" method="post" enctype="multipart/form-data"> <dl> <dt>ニックネーム<span class="required">必須</span></dt> <dd><input type="text" name="name" size="35" maxlength="255" value="<?php echo h($_POST['name']); ?>"> <?php if ($error['name'] == 'blank'): ?> <p class="error">※ニックネームを入力してください</p> <?php endif; ?> </dd> <dt>メールアドレス<span class="required">必須</span></dt> <dd><input type="text" name="email" size="35" maxlength="255" value="<?php echo h($_POST['email']); ?>"> <?php if ($error['email'] == 'blank'): ?> <p class="error">※メールアドレスを入力してください</p> <?php endif; ?> <?php if ($error['email'] == 'duplicate'): ?> <p class="error">※指定したメールアドレスは既に登録されています</p> <?php endif; ?> </dd> <dt>パスワード<span class="required">必須</span></dt> <dd><input type="password" name="password" size="10" maxlength="20"> <?php if ($error['password'] == 'blank'): ?> <p class="error">※パスワードを入力してください</p> <?php endif; ?> <?php if ($error['password'] == 'length'): ?> <p class="error">※パスワードは4文字以上で入力してください</p> <?php endif; ?> </dd> <dt>写真など</dt> <dd><input type="file" name="image" size="35"/> <?php if ($error['image'] == 'type'): ?> <p class="error">※写真などは[.gif]または[.jpg]の画像を指定してください</p> <?php endif; ?> <?php if (!empty($error)): ?> <p class="error">恐れ入りますが、画像を改めて指定してください</p> <?php endif; ?> </dd> </dl> <div><input type="submit" value="入力内容を確認する"></div> </form>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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