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>

2013-02-23

リクエストはキャンセルできない

基本的なことを知らなかった。


<?php
$fp = fopen('/var/tmp/hoge.txt', 'wb');
for ($i = 0; $i < 1000; $i++) {
    //  カウンタをファイルへ出力
    fwrite($fp, "{$i}\n");
    //  1秒待機
    sleep(1);
}



千秒カウントし、カウンタをファイルに出力するPGを作ってみた。

このPGへブラウザからアクセスして、途中で [ Esc ] キーでキャンセルした。



つもりだった。



で、サーバー上のファイルを less コマンドで開いて [Shift] + G で何気に表示を更新していたら、ファイルにカウンタが出力され続けていた。



・・・一度受け付けたリクエストは、サーバー上で処理が終わるか、サービスが再起動されるまで処理され続けることがわかった。





知らなかったおれ、恥ずかしい・・・

2013-02-19

postgresqlでシーケンスの一覧を取得する

SELECT relname 
FROM pg_class AS c 
JOIN pg_namespace AS n 
ON (c.relnamespace = n.oid) 
WHERE c.relkind = 'S' 
AND n.nspname = 'public';

.htaccessで403を404で返す

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