2013-02-28

PHPで2重ポスト対策 その2 同一ページ内で処理

流れのサンプルなので、XSSとかSQLインジェクションとか考慮してません。

なので、使うときは考慮してね。

<?php
$act    = isset($_POST['act'])  ? $_POST['act']  : 'init';
$data   = isset($_POST['data']) ? $_POST['data'] : '';
$ticket = '';

session_start();

//  初期化処理
if ($act == 'init') {
    $act = 'check';
}
//  チェック処理
else if (($act == 'check') || ($act == 'regist')) {
    if (チェック処理正常) {
        $act = 'regist';
        $ticket = time();
        $_SESSION['ticket'] = $ticket;
    }
    //  登録処理
    else {
        //  2重ポスト時
        if (empty($_SESSION['ticket'])) {
            //  2重ポストされたときの処理
        }
        //  不正なポスト時
        else if ($ticket != $_SESSION['ticket']) {
            //  不正な処理
        }
        //  正常なポスト時
        else {
            //  先にチケットを空にする
            unset($_SESSION['ticket']);

            //  登録処理
            if (登録処理正常) {
                header("Location: 登録完了ページのURL", true, 303);
                exit();
            }
            else {
            }
        }
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>sample</title>
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<form method="post">
<input type="text"   name="data"   value="<?php echo $data ?>">
<input type="submit" value="<?php echo $caption ?>">
<input type="hidden" name="ticket" value="<?php echo $ticket ?>">
<input type="hidden" name="act"    value="<?php echo $act ?>">
</form>
</body>
</html>

0 件のコメント:

コメントを投稿

.htaccessで403を404で返す

久しぶりにリライトルールを書いたよ。 ドキュメントルートに.htaccessを置く場合の記述↓ # 403.html は実体がなくてよい。この設定をすることで、あっても使われなくなる。 ErrorDocument 403 /403.html # 独自の404ページをドキュメ...