[PHP-users 19449]Re: 重複投稿/submitを防ぐトランザクショントークンという考え方

Mori Reo list-program @ rucifer.ddo.jp
2003年 12月 20日 (土) 18:57:16 JST


森です。

Kawazoe Tomonori <tsk @ ibakou.com>さん:
> ソースのこの部分がatomicでないと、多重に処理される可能性はまだあります。

これは気がつきませんでした。
具体的に動作はしたものの、検証する方法が思いつきません。
このスクリプトを普通に実行しただけでは、ロックされている場合の
処理が全く実行されません。ロック処理を検証する良いアイデアは
ありますか?

nextpage.php--------------------------------------------------------

<?php session_start(); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
    <meta HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=EUC-JP">
</head>
<body>

<?php
//送信ボタンを連続して押しやすくする
sleep(1);

if(isset($_SESSION['ttlock'])){
    $lock = $_SESSION['ttlock'];
}else{
    $_SESSION['ttlock'] = $lock = 'unlock';
}

if($lock === 'unlock'){
    $_SESSION['ttlock'] = 'lock';
    if($_REQUEST['tt']){
        $ttoken =(string) $_REQUEST['tt'];
        $sesToken =(string) $_SESSION['tt'];
        if($ttoken === $sesToken){
            print "正常です";
            $_SESSION['tt'] = "unavailable";
            $_SESSION['ttlock'] = 'unlock';
        }else{
            print "多重送信です";
            $_SESSION['ttlock'] = 'unlock';
        }
    }else{
        print "トークンがありません";
        $_SESSION['lock'] = 'unlock';
    }
}else{
    print "ロックされています";
}
?>
</body>
</html>

--------------------------------------------------------------------

------------
森 怜峰 <reo @ rucifer.ddo.jp>


PHP-users メーリングリストの案内