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

Mori Reo list-program @ rucifer.ddo.jp
2003年 12月 20日 (土) 02:05:14 JST


森です。

極めて単純なサンプルスクリプトを書きました。
WindowsXP, IE6, PHP4.3.2 で動作確認しています。
連続してサブミットすると"多重送信です"と表示されます。

index.php----------------------------------------------

<?php
    session_start();

    $_SESSION['tt'] = '';
    $ttoken = '';

    //ある程度一意な文字列を生成する
    $ttoken =(string) uniqid('transactiontoken');
    $_SESSION['tt'] =(string) $ttoken;

?>
<!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>

<form method="GET" action="./nextpage.php">
    <input type="hidden" name="tt" value="<?php print $ttoken ?>">
    <input type="submit">
</form>

</body>
</html>

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

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($_REQUEST['tt']){
    $ttoken =(string) $_REQUEST['tt'];
    $sesToken =(string) $_SESSION['tt'];
    if($ttoken === $sesToken){
        print "正常です";
        $_SESSION['tt'] = "unavailable";
    }else{
        print "多重送信です";
    }
}else{
    print "トークンがありません";
}

?>
</body>
</html>

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

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


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