ワンタイムチケット
リロード対策やCSRF対策
php文
.‥‥‥
$_SESSION['ticket'] = md5(uniqid().mt_rand()); //ランダムなIDを生成する
?>
<form action="complete.php" method="post">
<input type="hidden" name="ticket" value="<?= htmlspecialchars($_SESSION['ticket']), ENT_QUOTES); ?>">
<input type="submit" name="submit_button" value="完了画面へ遷移">
</form>
確認画面でチケットを発行し、セッションに保存しておきます。同時に完了画面へチケットがPOSTされるよう、hiddenにセット。こうして完了画面へ遷移させます。
if (isset($_POST['submit_button'], $_SESSION['ticket'], $_POST['ticket']) && $_SESSION['ticket'] === $_POST['ticket']) {
unset($_SESSION['ticket']);
if (!$form->validation()) {
// 不正な値が入っていた場合は例外処理
header("Location: http://{$_SERVER['HTTP_HOST']}/top.php");
exit;
}
// 1回しか行わない処理
$db->insert($form);
$mail->send();
}
// 登録完了画面出力
$tpl->display();
確認画面で発行されたチケットは一度使い切ってしまえば2度処理される事なくリロード対策となる
$_REQUEST
$_REQUEST
$_GET, $_POST, $_COOKIE, $_FILES の内容を格納した連想配列 。
ようはGETメソッドの場合、$_GETでも$_REQUESTでも情報を取れるし
POSTメソッドの場合、$_POSTでも$_REQUESTでも情報を取れる
ということ。
