パスワード認証ログインシステムのサンプルの続編。
ログイン画面にログインをスキップさせるチェックボックスが付いてることがありますが

コレを前に書いたソースに追加してみようっていう記事です。
名称は「次回からは自動的にログイン」とか「パスワードを記憶する」とかが一般的なのかな。
サンプルは前エントリーのセッション版を用いたものだけですが、Cookieでもやる事はそう変わらないです。

処理の流れは大体こんな感じ…

ログイン画面

「次回からは自動的にログイン」のチェックボックスはnameをmemory、valueをtrueに、
クッキーはnameをTEST_COOKIEとしています。

暗号化はmd5の他にsha1もあるよってことでsha1に変更してます。

login.php

<?php
define("PASSWORD", "pass");
$message = "";

session_start();

//クッキーの存在確認
if(isset($_COOKIE&#91;"TEST_COOKIE"&#93;) && $_COOKIE&#91;"TEST_COOKIE"&#93; === sha1(PASSWORD)){
	
	$_SESSION&#91;"TEST"&#93; = $_COOKIE&#91;"TEST_COOKIE"&#93;;
	header("Location:admin.php");
	
}

if(isset($_POST&#91;"action"&#93;)&&$_POST&#91;"action"&#93;==="login"){
	if(PASSWORD === $_POST&#91;"password"&#93;){//パスワード確認
		
		$_SESSION&#91;"TEST"&#93; = sha1(PASSWORD);//暗号化してセッションに保存
		
		if(isset($_POST&#91;"memory"&#93;) && $_POST&#91;"memory"&#93;==="true"){//次回からは自動的にログイン
			setcookie("TEST_COOKIE", $_SESSION&#91;"TEST"&#93;, 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&#91;"TEST_COOKIE"&#93;) && $_COOKIE&#91;"TEST_COOKIE"&#93; != ""){
	
	$_SESSION&#91;"TEST"&#93; = $_COOKIE&#91;"TEST_COOKIE"&#93;;
}

if(isset($_SESSION&#91;"TEST"&#93;) && $_SESSION&#91;"TEST"&#93; != null && sha1(PASSWORD) === $_SESSION&#91;"TEST"&#93;){
	$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>

実際に使う時は暗号化したパスをまるっと保存させるのではなく、
さらに何かしら手を加えてから保存した方がいいと思う。