パスワードフィールドに入力された文字列を設定されたパスワードと照合し、一致していたらログイン後画面に飛ばす
簡単なログイン処理のサンプルソースです。
CookieとSession両方晒しておきます。
phpファイルを二つ用意しますが、便宜的に
- login.php → ログイン画面
- admin.php → ログイン後画面
としています。
先頭行にパスワードを設定する定数がありますが、
ファイル数の多いスクリプトではconfig.phpなどを作ってincludeすることが多いです。
ログイン処理の流れは大体こんな感じです。
- パスワードフィールドに文字列入れて送信
- 送信された文字列が設定されたパスワードと一致するか確認
- 一致していたらクッキー、またはセッションに暗号化したパスワードを保存して次のページへ遷移
- 一致していなかったらエラーメッセージを出す
ログアウト処理について追記しました
Cookie版
login.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php define( "PASSWORD" , "pass" ); if (isset( $_POST [ "action" ])&& $_POST [ "action" ]=== "login" ){ //POSTされたactionの値がloginだったら if (PASSWORD=== $_POST [ "password" ]){ //パスワード確認 setcookie( "TEST" , md5(PASSWORD)); //暗号化してクッキーに保存 header( "Location:admin.php" ); //admin.phpに飛ばす } else { setcookie( "TEST" , "" , time() - 3600); //時間を過去に設定してクッキーを削除 message(); //エラー表示 } } ?> <?php function message(){ print "パスワードが違います" ; } ?> <form action= "" method= "post" ><input name= "password" type= "text" value= "pass" /><input name= "action" type= "submit" value= "login" /></form> |
admin.php
1 2 3 4 5 6 7 8 9 | <?php define( "PASSWORD" , "pass" ); if (isset( $_COOKIE [ "TEST" ]) && $_COOKIE [ "TEST" ] != null && md5(PASSWORD) === $_COOKIE [ "TEST" ]){ //クッキーの値がパスワードと一致するか確認 print "Login success" ; } else { print "Login false" ; } ?> |
セッション版
login.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php define( "PASSWORD" , "pass" ); session_start(); if (isset( $_POST [ "action" ])&& $_POST [ "action" ]=== "login" ){ if (PASSWORD === $_POST [ "password" ]){ //パスワード確認 $_SESSION [ "TEST" ] = md5(PASSWORD); //暗号化してセッションに保存 header( "Location:admin.php" ); } else { session_destroy(); //セッション破棄 message(); } } ?> <?php function message(){ print "パスワードが違います" ; } ?> <form action= "" method= "post" ><input name= "password" type= "text" value= "pass" /><input name= "action" type= "submit" value= "login" /></form> |
admin.php
1 2 3 4 5 6 7 8 9 10 11 | <?php define( "PASSWORD" , "pass" ); session_start(); if (isset( $_SESSION [ "TEST" ]) && $_SESSION [ "TEST" ] != null && md5(PASSWORD) === $_SESSION [ "TEST" ]){ print "Login success" ; } else { session_destroy(); //セッション破棄 print "Login false" ; } ?> |
うっかりsession_start()抜けてたの修正
setcookie()もsession_start()もブラウザに何か出力を行う前にコールする必要があります。
<?phpの上に空白行があるだけでもエラーになるので要注意。
ハッシュ化する関数はmd5のほかにsha1があります。
ログアウト処理
このサンプルでのログイン条件は、「SessionまたはCookieに保存されている値が暗号化されたパスワードと一致しているか」です。
なのでログアウトしたい場合には、その保存されているSessionやCookieを破棄した上でトップにリダイレクトすればいいということになります。
まずはボタン。nameをlogoutとしときます。(共通)
1 2 3 | < form action = "" method = "post" > < p >< button type = "submit" name = "logout" >ログアウト</ button ></ p > </ form > |
admin.phpに追加する処理。
Cookie版
やる事はログイン失敗時の処理と同じです。
1 2 3 4 | if (isset( $_POST [ 'logout' ])){ setcookie( "TEST" , "" , time() - 3600); header( "Location:index.php" ); } |
Session版
マニュアルそのままです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | if (isset( $_POST [ 'logout' ])){ // セッション変数を全て解除する $_SESSION = array (); // セッションを切断するにはセッションクッキーも削除する。 // Note: セッション情報だけでなくセッションを破壊する。 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(); header( "Location:index.php" ); } |
admin.phpの頭にsession_start();が抜けていますよ。
おーっと!本当ですね。ご指摘ありがとうございます。
サンプルを試してみたのですが初心者のためにわからないことがあります・・・
このサンプルのパスワードは何ですか?
また「パスワードが違います」の表示はどういう動作のときに出てくるのでしょうか?
ykさん>
>このサンプルのパスワードは何ですか?
ソースに書いてあります。解読しましょう
>また「パスワードが違います」の表示はどういう動作のときに出てくるのでしょうか?
ソースに書いてある通りです。解読出来れば分かります。
スクリプトを参考にさせていただきました。
IE、Fox等バージョンによっては session_destroy() が効かずログアウトできなくなります。
同時に session_unset() でもログアウトさせた方が良いのではないでしょうか?
ちなみに私のバージョンはIE8です。
hoshi さん>
最近PHP触ってないので具体的な対策については控えさせていただきますが
サンプルソースをそのまま使うのはセキュリティ的にアウトなので
手を加えた方がいいのは間違いないです。
>>11-10-03 (月) 20:44
申し訳ありません、よく読んでいませんでした。
サンプルソースをわかりやすく解説してくださっていたんですね。
さらに手を加えて使用させていただきます。
ところでひとつ気になったことがあるのですが、かなり昔の記事なのにお返事が早いのはこのサイトにコメントがあると、連絡がくるような仕組みになっているからですか?
自分のサイトを作ろうと考えているので、参考程度にお聞かせいただけると嬉しいです。
記事内容に関与しないお話で申し訳ありません。
hoshi さん>
このブログはWordpressを使っているんですが、デフォルトの機能で
コメントが付いたらメールを飛ばすというものがあります。
FC2やライブドアなどの間借りするブログサービスでも大抵備わっていますよ。
11-10-03 (月) 23:31
お返事ありがとうございます。
WordPressは少し触れていましたが、機能の存在に気づいていませんでした。
そんな便利な機能があったんですね。今後参考にします。
ありがとうございました!
ファイルはみんな同じところに入れればいいので?
サンプルで用意するlogin.phpとadmin.phpをソース諸共そのまま使うのであれば
同階層でなければエラーが出て動きません。
はじめまして。私はプログラミングもPHPも、初心者です。
「やさしいPHP」という本を読み終わったのですが、そのあとにどのような書籍を読めばいいのか迷っています。
Tenderfeelさんのように自分で認証コードや掲示板を書けるようになりたいのですが、何かアドバイスを頂けない
でしょうか?
ケン さん>
暫く離れていた内にすっかり忘れてしまった上にPHPが激変していたので、私も再入門中です!
書いてみたらやたら長くなってしまったので、あとで記事として公開します。
そちらを参考にしていただければと思います。