[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 メーリングリストの案内