ブログトップ 記事一覧 ログイン 無料ブログ開設

大人になったら肺呼吸 RSSフィード Twitter

2010-08-28

初心者向け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によるログイン機能のサンプルコードは、以下のサイトが参考になります。


関連エントリ

YoHarmonicaYoHarmonica 2014/04/02 13:49 こんにちは、参考にさせていただきました。

ログイン後のメイン画面(login.php) ← メイン画面は main.phpでしょうか。多分タイプミスですね。

よろしくお願いします。

replicationreplication 2014/04/12 12:18 ご指摘ありがとうございます。
訂正しました。

SexraekoSexraeko 2014/06/25 21:34 これは一つのIDでログインするようになっていますが
複数ログインとなるとどうなるのですか?

「Sexraeko1」 「Sexraeko2」 のID ※パスワードはIDと同じ
このようにするには どういう編集がいるのですか?

typeof_the_endtypeof_the_end 2014/06/27 16:18 初めまして。参考になりました。

ログイン画面で1箇所ほどエラーを吐いてしまうようです。
「login.php」の
$viewUserId = htmlspecialchars($_POST["userid"], ENT_QUOTES);
だけでは、初回アクセス時と2回目で条件を付けないといけないそうです。

以下のように対処しました。
$viewUserId = isset($_POST["userid"]) ? htmlspecialchars($_POST["userid"], ENT_QUOTES) : "";

ありがとうございました。

replicationreplication 2014/06/27 23:42 Sexraekoさん
以下のような感じでしょうか。
if ($_POST["userid"] == "Sexraeko1" && $_POST["password"] == "hoge") ||
($_POST["userid"] == "Sexraeko2" && $_POST["password"] == "hoge") {
// 処理
}

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証