ユーザ認証

ユーザ名 hoge パスワード geho,またはユーザ名・パスワードともに guest で入れます。

ソース

このページの最初の部分は次のようになっています:

<?php
  session_set_cookie_params(0, '/~okumura/php/');
  session_start();
  $users = array('hoge' => 'geho', 'guest' => 'guest');
  if (isset($_POST['username']) && isset($_POST['password'])) {
    if (isset($users[$_POST['username']]) && $users[$_POST['username']] == $_POST['password']) {
      $_SESSION['username'] = $_POST['username'];
    } elseif (isset($_SESSION['username'])) {
      unset($_SESSION['username']);
    }
  }
?>

ここで $users = array('hoge' => 'geho', 'guest' => 'guest');$users['hoge'] = 'geho'; $users['guest'] = 'guest'; と同じことです。

上のフォームの部分は次のように書いてあります:

<?php if (!isset($_SESSION['username'])) { ?>

<form action="login.php" method="post">
<p>Username: <input name="username" size="20"></p>
<p>Password: <input type="password" name="password" size="20"></p>
<p><input type="submit" value="ログイン"></p>
</form>

<p>ユーザ名 hoge パスワード geho,またはユーザ名・パスワードともに guest で入れます。</p>

<?php } else { ?>

<p>あなたは <?php echo htmlspecialchars($_SESSION['username']) ?> としてログインしています。</p>

<form action="login.php" method="post">
<p>
<input type="hidden" name="username" value="dummy">
<input type="hidden" name="password" value="dummy">
<input type="submit" value="ログアウト">
</p>
</form>

<?php } ?>

改良すべき点

生パスワードをPHPソース(または別のテキストファイルまたはデータベース)に格納するのではなく,そのハッシュ値を格納しておくほうが安全です。例えばパスワードが geho の場合,md5('geho') の値 '76e7975454ce7833a24ba266f5b75503' を格納しておき,パスワードを入力したらその md5 値がこれと等しいか調べます。md5 値から元のパスワードは容易にわかりません。y = md5(x) から x の値を求めるのは現時点では不可能ですが,md5(x1) = md5(x2) を満たす x1,x2 を見つける方法はすでに存在しますので,用途によっては md5() はすでに十分安全ではありません。一般には,今後は md5() よりもっと良いハッシュ関数 sha1() をお薦めします。

というのはもう古く,今は sha1() でも十分とは考えられていません。PHPで例えば hoge の sha256 を求めるには hash('sha256', 'hoge') とします。この値は ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825 のようになります。

さらには,ソルト(salt)という仕組みと組み合わせるのが推奨です。ソルトについては授業で説明します。

ソルトを使う際に必要になるかもしれないこと:


Last modified: