ユーザーがテキストを入力したり、画像を選択したりできるサイトの領域を用意します。この結果をユーザー ID に対してデータベースに保存します。
これが完了したら、この値を暗号化し、Cookie に設定します。
// Set a secret key
define('SECRET_KEY', 'HNBG:^yhCY*1omNhRg&');
// Sign in text - get this from the users row in the database
$signinSeal = 'Hello, User!';
// Encrypt value
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SECRET_KEY, $signinSeal, MCRYPT_MODE_ECB, $iv);
// Concat with IV - base64 so it can be safely sent
$encrypted = base64_encode($iv) . '|' . base64_encode($encrypted);
// Set in a cookie - mark as HTTP only to prevent it being stolen in an XSS attack
setcookie('signinSeal', $encrypted, time() + (60 * 60 * 24 * 30), '/', 'example.com', false, true);
ユーザーがログイン ページにアクセスすると、「signinSeal」Cookie の存在を確認し、base64 でデコードし、復号化して表示します。
if (array_key_exists('signinSeal', $_COOKIE) && !empty($_COOKIE['signinSeal'])) {
// Split IV and encrypted string
$fields = explode('|', $_COOKIE['signinSeal']);
$iv = base64_decode($fields[0]);
$encrypted = base64_decode($fields[1]);
// Decrypt value
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SECRET_KEY, $encrypted, MCRYPT_MODE_ECB, $iv);
// And display to the user
echo htmlspecialchars($decrypted);
}
ログインしたら、有効期限が切れないように、Cookie を再度設定します。