パスワード認証ログインシステムのサンプルの続編。
ログイン画面にログインをスキップさせるチェックボックスが付いてることがありますが
コレを前に書いたソースに追加してみようっていう記事です。
名称は「次回からは自動的にログイン」とか「パスワードを記憶する」とかが一般的なのかな。
サンプルは前エントリーのセッション版を用いたものだけですが、Cookieでもやる事はそう変わらないです。
処理の流れは大体こんな感じ…
ログイン画面
「次回からは自動的にログイン」のチェックボックスはnameをmemory、valueをtrueに、
クッキーはnameをTEST_COOKIEとしています。
暗号化はmd5の他にsha1もあるよってことでsha1に変更してます。
login.php
<?php
define("PASSWORD", "pass");
$message = "";
session_start();
//クッキーの存在確認
if(isset($_COOKIE["TEST_COOKIE"]) && $_COOKIE["TEST_COOKIE"] === sha1(PASSWORD)){
$_SESSION["TEST"] = $_COOKIE["TEST_COOKIE"];
header("Location:admin.php");
}
if(isset($_POST["action"])&&$_POST["action"]==="login"){
if(PASSWORD === $_POST["password"]){//パスワード確認
$_SESSION["TEST"] = sha1(PASSWORD);//暗号化してセッションに保存
if(isset($_POST["memory"]) && $_POST["memory"]==="true"){//次回からは自動的にログイン
setcookie("TEST_COOKIE", $_SESSION["TEST"], time()+3600*24*14);//暗号化してクッキーに保存
}
header("Location:admin.php");
}else{
session_destroy();//セッション破棄
$message = "パスワードが違います";
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<?php
if($message!=""){
print "<p class=\"message\">".$message."</p>\n";
}
?>
<form action="" method="post">
<p><input name="password" type="text" value="pass" /><input name="action" type="submit" value="login" /></p>
<p><label><input type="checkbox" name="memory" value="true" />次回からは自動的にログイン</label></p>
</form>
</body>
</html>
パスワードの確認が終わった後にチェックボックスがチェックされているか確認して、
チェックされていたらクッキーに暗号化したパスワードを保存する。
次に、ログイン画面にアクセスした時の為に、$_COOKIEを確認して
値がパスワードと一致したらセッションに保存してからページ遷移させる。
クッキーはsetcookieする時に期限を設定しておけば自動的に消えます。
上記の例だと期限は2週間になります。
管理画面
ログイン画面と同じく、アクセスした時用に$_COOKIEを確認して
値があったらセッションに保存する。
直ぐ下にセッションを確認するロジックがあるので、パスワードと一致しなければFALSEになる。
FALSEの場合にはlogin.phpへ遷移させるように変更してます。
admin.php
<?php
define("PASSWORD", "pass");
$message = "";
session_start();
if(isset($_COOKIE["TEST_COOKIE"]) && $_COOKIE["TEST_COOKIE"] != ""){
$_SESSION["TEST"] = $_COOKIE["TEST_COOKIE"];
}
if(isset($_SESSION["TEST"]) && $_SESSION["TEST"] != null && sha1(PASSWORD) === $_SESSION["TEST"]){
$message = "Login success";
}else{
session_destroy();//セッション破棄
header("Location:login.php");
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Admin</title>
</head>
<body>
<h1>Admin</h1>
<?php
if($message!=""){
print "<p class=\"message\">".$message."</p>\n";
}
?>
</body>
</html>
実際に使う時は暗号化したパスをまるっと保存させるのではなく、
さらに何かしら手を加えてから保存した方がいいと思う。
こんにちは。
ログイン機能を探していたところたどり着きました。
サンプル使わせていただいて大変助かってます!
これに、ログアウト機能ってつけられませんか?
$message = “Login success”; が表示される箇所に
ログアウトへのリンク?を付けられたらいいなと思っています。
追加してみようと試みたのですが、当方PHP知識ないため・・・。
ご教授いただければ幸いです!
ゆう さん >
元記事の方に追記しましたのでこちらをご覧ください。
http://tenderfeel.xsrv.jp/php/628/
さっそくの対応ありがとうございます!
無事ログアウト機能もつけることができました!感謝です!
はじめまして
いつもサイトの情報を参考にさせて頂きphpの勉強中です。
”実際に使う時は暗号化したパスをまるっと保存させるのではなく、
さらに何かしら手を加えてから保存した方がいいと思う。”
とあるのですが、実際に公開するアプリケーションでは具体的にはどのような方法をとるのでしょうか?
このあたりを詳しく説明している情報にたどり着けず悩んでいます。
何か参考になる文献など情報があれば教えて頂けると嬉しいです。
はじめまして。いきなりすみません。
こちらのサンプルコードではクッキーにパスワードを保存されていますが、
ログインという性質上、セッション変数にユーザーIDを保存した上で、
セッションIDにて認証を行う方が良いのではないでしょうか。
確かにクッキーに保存しておいた情報を後から使うのが実装としては素直かと思うのですが、
セキュリティという観点から見ると、クッキーには一切のユーザー情報を含めず、
セッションIDにて認証を行うのが望ましいとされています。
http://blog.ohgaki.net/espcs_if_a_fa_ia_a_pa_e_oa_a_sa_da_ca_sa
http://tumblr.tokumaru.org/post/42467648113/donot-store-loginid-in-a-cookie
また、ログイン成功時にはsession_regenerate_idでセッションIDを生成しなおすことで、
セッションフィクセイション(攻撃者が用意したセッションIDを別のユーザーに使わせ、
セッションハイジャックを試みる攻撃)の対策ができるようです。
コーイチ さん>
返事したつもりがしてなかったようですみません。
ネットだと探しても見つからないというのは同感です。
(なんせこの記事が1ページ目に出るくらいですので)
というわけで徳丸本をお薦めします。
体系的に学ぶ 安全なWebアプリケーションの作り方
http://bookpub.jp/books/bp/144
Sulky さん>
マジレスありがとうございます。
前記事へのコメントに見えますが大丈夫でしょうか。
検索して当記事・前記事を見るのはどうやったらいいか分からない人です。
なので題名にある機能だけをコピペで実行できて、読んでも処理内容を追いやすいサンプルを乗せています。
セキュリティ面で理想的な方法はありますが初心者向けではないので、
このままの実装だと危ないということを示すだけに留めています。
より安全な方法についてはセキュリティに関する事が気になるようになったら調べればいいと思ってます。