Home > PHP > [php] パスワード認証ログインシステムのサンプル

[php] パスワード認証ログインシステムのサンプル

パスワードフィールドに入力された文字列を設定されたパスワードと照合し、一致していたらログイン後画面に飛ばす
簡単なログイン処理のサンプルソースです。
CookieとSession両方晒しておきます。

phpファイルを二つ用意しますが、便宜的に

  • login.php → ログイン画面
  • admin.php → ログイン後画面

としています。

先頭行にパスワードを設定する定数がありますが、
ファイル数の多いスクリプトではconfig.phpなどを作ってincludeすることが多いです。

ログイン処理の流れは大体こんな感じです。

  1. パスワードフィールドに文字列入れて送信
  2. 送信された文字列が設定されたパスワードと一致するか確認
  3. 一致していたらクッキー、またはセッションに暗号化したパスワードを保存して次のページへ遷移
  4. 一致していなかったらエラーメッセージを出す

ログアウト処理について追記しました

Cookie版

login.php

PHP:
  1. <?php
  2. define("PASSWORD", "pass");
  3. if(isset($_POST["action"])&&$_POST["action"]==="login"){//POSTされたactionの値がloginだったら
  4.    
  5.     if(PASSWORD=== $_POST["password"]){//パスワード確認
  6.         setcookie("TEST", md5(PASSWORD));//暗号化してクッキーに保存
  7.         header("Location:admin.php");//admin.phpに飛ばす
  8.        
  9.     }else{
  10.         setcookie("TEST", "", time() - 3600);//時間を過去に設定してクッキーを削除
  11.         message();//エラー表示
  12.     }
  13. }
  14. ?>
  15. <?php
  16. function message(){
  17.     print "パスワードが違います";
  18. }
  19. ?>
  20. <form action="" method="post"><input name="password" type="text" value="pass" /><input name="action" type="submit" value="login" /></form>

admin.php

PHP:
  1. <?php
  2. define("PASSWORD", "pass");
  3. if(isset($_COOKIE["TEST"]) && $_COOKIE["TEST"] != null && md5(PASSWORD) === $_COOKIE["TEST"]){//クッキーの値がパスワードと一致するか確認
  4.     print "Login success";
  5.        
  6. }else{
  7.     print "Login false";
  8. }
  9. ?>

セッション版

login.php

PHP:
  1. <?php
  2. define("PASSWORD", "pass");
  3. if(isset($_POST["action"])&&$_POST["action"]==="login"){
  4.    
  5.     if(PASSWORD === $_POST["password"]){//パスワード確認
  6.         $_SESSION["TEST"] = md5(PASSWORD);//暗号化してセッションに保存
  7.         header("Location:admin.php");
  8.        
  9.     }else{
  10.         session_destroy();//セッション破棄
  11.         message();
  12.     }
  13. }
  14.  
  15. ?>
  16. <?php
  17. function message(){
  18.     print "パスワードが違います";
  19. }
  20. ?>
  21. <form action="" method="post"><input name="password" type="text" value="pass" /><input name="action" type="submit" value="login" /></form>

admin.php

PHP:
  1. <?php
  2. define("PASSWORD", "pass");
  3. if(isset($_SESSION["TEST"]) && $_SESSION["TEST"] != null && md5(PASSWORD) === $_SESSION["TEST"]){
  4.     print "Login success";
  5.        
  6. }else{
  7.     session_destroy();//セッション破棄
  8.     print "Login false";
  9. }
  10. ?>

うっかりsession_start()抜けてたの修正

setcookie()もsession_start()もブラウザに何か出力を行う前にコールする必要があります。
<?phpの上に空白行があるだけでもエラーになるので要注意。

ハッシュ化する関数はmd5のほかにsha1があります。

「次回からは自動的にログイン」追加編はこちら

ログアウト処理

このサンプルでのログイン条件は、「SessionまたはCookieに保存されている値が暗号化されたパスワードと一致しているか」です。
なのでログアウトしたい場合には、その保存されているSessionやCookieを破棄した上でトップにリダイレクトすればいいということになります。

まずはボタン。nameをlogoutとしときます。(共通)

HTML:
  1. <form action="" method="post">
  2. <p><button type="submit" name="logout">ログアウト</button></p>
  3. </form>

admin.phpに追加する処理。

Cookie版

やる事はログイン失敗時の処理と同じです。

PHP:
  1. if(isset($_POST['logout'])){
  2.     setcookie("TEST", "", time() - 3600);
  3.     header("Location:index.php");
  4. }

Session版

マニュアルそのままです。

PHP:
  1. if(isset($_POST['logout'])){
  2.  
  3. // セッション変数を全て解除する
  4. $_SESSION = array();
  5.  
  6. // セッションを切断するにはセッションクッキーも削除する。
  7. // Note: セッション情報だけでなくセッションを破壊する。
  8. if (ini_get("session.use_cookies")) {
  9.     $params = session_get_cookie_params();
  10.     setcookie(session_name(), '', time() - 42000,
  11.         $params["path"], $params["domain"],
  12.         $params["secure"], $params["httponly"]
  13.     );
  14. }
  15.  
  16. //セッションを破壊してリダイレクト
  17. header("Location:index.php");
  18. }
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

Comments:9

wamu 09-11-12 (木) 18:52

admin.phpの頭にsession_start();が抜けていますよ。

Tenderfeel 09-11-12 (木) 19:26

おーっと!本当ですね。ご指摘ありがとうございます。

yk 11-08-28 (日) 16:24

サンプルを試してみたのですが初心者のためにわからないことがあります・・・
このサンプルのパスワードは何ですか?

また「パスワードが違います」の表示はどういう動作のときに出てくるのでしょうか?

Tenderfeel 11-09-01 (木) 13:11

ykさん>

>このサンプルのパスワードは何ですか?
ソースに書いてあります。解読しましょう

>また「パスワードが違います」の表示はどういう動作のときに出てくるのでしょうか?
ソースに書いてある通りです。解読出来れば分かります。

hoshi 11-10-03 (月) 19:35

スクリプトを参考にさせていただきました。
IE、Fox等バージョンによっては session_destroy() が効かずログアウトできなくなります。
同時に session_unset() でもログアウトさせた方が良いのではないでしょうか?
ちなみに私のバージョンはIE8です。

Tenderfeel 11-10-03 (月) 20:44

hoshi さん>
最近PHP触ってないので具体的な対策については控えさせていただきますが
サンプルソースをそのまま使うのはセキュリティ的にアウトなので
手を加えた方がいいのは間違いないです。

hoshi 11-10-03 (月) 23:23

>>11-10-03 (月) 20:44

申し訳ありません、よく読んでいませんでした。
サンプルソースをわかりやすく解説してくださっていたんですね。
さらに手を加えて使用させていただきます。

ところでひとつ気になったことがあるのですが、かなり昔の記事なのにお返事が早いのはこのサイトにコメントがあると、連絡がくるような仕組みになっているからですか?
自分のサイトを作ろうと考えているので、参考程度にお聞かせいただけると嬉しいです。
記事内容に関与しないお話で申し訳ありません。

Tenderfeel 11-10-03 (月) 23:31

hoshi さん>

このブログはWordpressを使っているんですが、デフォルトの機能で
コメントが付いたらメールを飛ばすというものがあります。
FC2やライブドアなどの間借りするブログサービスでも大抵備わっていますよ。

hoshi 11-11-21 (月) 22:30

11-10-03 (月) 23:31

お返事ありがとうございます。
WordPressは少し触れていましたが、機能の存在に気づいていませんでした。
そんな便利な機能があったんですね。今後参考にします。
ありがとうございました!

Comment Form
Remember personal info

Trackbacks:2

Trackback URL for this entry
http://tenderfeel.xsrv.jp/php/628/trackback/
Listed below are links to weblogs that reference
[php] パスワード認証ログインシステムのサンプル from WebTecNote
pingback from PHP | SanRin舎 11-02-27 (日) 16:18

[...] [php] パスワード認証ログインシステムのサンプル参照。 Posted in Web « @nicovideojp の更新が1 PSP改造 » You can leave a response, or trackback from your own site. [...]

pingback from PHPでログイン機能を実装するために必要なことメモ 11-12-08 (木) 14:11

[...] サンプルソースコード http://tenderfeel.xsrv.jp/php/628/ http://mylearning.jugem.jp/?eid=8 asklife|IT&Life > コンピュータ・IT > [...]

Home > PHP > [php] パスワード認証ログインシステムのサンプル

最近の投稿
最近の修正
Tag Cloud
おすすめサーバー・他
メタ情報

Return to page top