小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


初心者向けPHP5でつくるログイン機能のサンプルアプリケーション

2014.07.05追記

以前書いたサンプルコードは、セキュリティ的な脆弱性を含んでいるので以下の記事を参照するようにしてください。

【初心者向け】PHP5とMySQLでつくるログイン機能のサンプルアプリケーション - 大人になったら肺呼吸@はてブロ【初心者向け】PHP5とMySQLでつくるログイン機能のサンプルアプリケーション - 大人になったら肺呼吸@はてブロ

はじめにPHP5とMySQLでログイン機能を実現するサンプルアプリケーションを作ってみました。PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiP...

はじめに

最近PHPを勉強しているのですが、手始めにPHP5でログイン機能を作ってみました。

10日でおぼえるPHP入門教室 第4版
山田 祥寛
翔泳社
売り上げランキング: 35,106

サンプルアプリケーションの概要

ログイン画面にユーザIDとパスワードを入力して、ログインすると、メインの画面を表示します。ログアウトのリンクをクリックすると、ログアウトします。

  • login.php
    • ログイン画面と認証の機能を持ちます。
  • main.php
    • ログイン画面で認証が成功したら、この画面を表示します。
  • logout.php
    • main.phpの画面でログアウトが選択された場合にログアウトします。
ログイン画面(login.php)

login.phpのコードは以下のようになっています。
ログインに失敗した場合は、$errorMessageにエラーメッセージを格納し、画面に表示しています。ログインに成功した場合は、セッションハイジャック対策として、session_regenerate_id( )を使って、セッションIDを再発行してから、main.phpを表示しています。

<?php
  session_start();
  
  // エラーメッセージ
  $errorMessage = "";
  // 画面に表示するため特殊文字をエスケープする
  $viewUserId = htmlspecialchars($_POST["userid"], ENT_QUOTES);

  // ログインボタンが押された場合      
  if (isset($_POST["login"])) {

    // 認証成功
    if ($_POST["userid"] == "hoge" && $_POST["password"] == "hoge") {
      // セッションIDを新規に発行する
      session_regenerate_id(TRUE);
      $_SESSION["USERID"] = $_POST["userid"];
      header("Location: main.php");
      exit;
    }
    else {
      $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";
    }
  }

?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>サンプルアプリケーション</title>
  </head>
  <body>
  <form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">
  <fieldset>
  <legend>ログインフォーム</legend>
  <div><?php echo $errorMessage ?></div>
  <label for="userid">ユーザID</label><input type="text" id="userid" name="userid" value="<?php echo $viewUserId ?>">
  <br>
  <label for="password">パスワード</label><input type="password" id="password" name="password" value="">
  <br>
  <label></label><input type="submit" id="login" name="login" value="ログイン">
  </fieldset>
  </form>
  </body>
</html>
ログイン後のメイン画面(main.php)

続いて、ログインに成功した場合に表示されるmain.phpです。この画面では、はじめにログイン状態のチェックを行っています。具体的には、$_SESSION["USERID"]に値が格納されているかを調べています。login.phpでログインに成功すると、$_SESSION["USERID"]にユーザIDを格納しているので、この値が入っていないという場合は、不正なアクセスとみなして、ログアウト画面を表示するようにしています。

<?php
session_start();

// ログイン状態のチェック
if (!isset($_SESSION["USERID"])) {
  header("Location: logout.php");
  exit;
}

echo "ようこそ" . $_SESSION["USERID"] . "さん";
?>

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>サンプルアプリケーション</title>
  </head>
  <body>
  <ul>
  <li><a href="logout.php">ログアウト</a></li>
  </ul>
  </body>
</html>
ログアウト画面(logout.php)

ログアウト画面では、セッション情報の破棄を行います。$_SESSION["USERID"]に値が格納されているかどうかで、意図的にログアウトしたのか、セッションタイムアウトでログアウトになったのかを判断して、メッセージを出力しています。
PHPのログアウト処理に関しては、以下のサイトが参考になります。

<?php
session_start();

if (isset($_SESSION["USERID"])) {
  $errorMessage = "ログアウトしました。";
}
else {
  $errorMessage = "セッションがタイムアウトしました。";
}
// セッション変数のクリア
$_SESSION = array();
// クッキーの破棄
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}
// セッションクリア
@session_destroy();
?>

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>サンプルアプリケーション</title>
  </head>
  <body>
  <div><?php echo $errorMessage; ?></div>
  <ul>
  <li><a href="login.php">ログイン画面に戻る</a></li>
  </ul>
  </body>
</html>
参考サイト

PHPによるログイン機能のサンプルコードは、以下のサイトが参考になります。