我在此之前询问了question我要求提供一种方法来阻止帖子在提交时被重新发送。
社区给了我这个功能:
function cansend($token) {
if(isset($_SESSION['token'])) {
if ($token == $_SESSION['token']){
$continue = false;
}
else {
$continue = true;
}
}
else {
$_SESSION['token'] = $token;
$continue = true;
}
return $continue;
}
这是完美的,并且做了我需要它,然而,由于某种原因,它总是返回true并且不会停止再次发布方法。
我的表格是这样的:
<?php
$token = rand();
if ($_POST) {
if (isset($_POST['submit'])) {
if (cansend($_POST['token'])) {
print $_POST['textinput'];
}
}
}
?>
<form action="#" method="post">
<input type="hidden" name="token" value="<?php echo $token ?>" />
<input type="text" name="textinput" />
<input type="submit" value="Submit" name="submit" />
</form>
我需要更改什么以及在哪里重新开始工作?
修改
实际代码:
$_SLIP = new BettingSlip();
if ($_SLIP->CanSend($_POST['token'])) {
if (isset($_POST['creditAcc'])) {
$_SLIP->SetUserBalance($_POST['id'], $_POST['amount'], 'in');
}
if (isset($_POST['setLimit'])) {
$_USERMAN->setlimit($_POST['id'], $_POST['limit']);
}
}
else {
echo "Cannot resend the same information twice";
}
答案 0 :(得分:1)
最简单的方法是在页面启动时创建一个随机值,并将其设置为会话和隐藏的表单,就像您现在正在做的那样。
<?php
$_SESSION['token'] = $somerandom; //give the session token a random value
$token = $somerandom; //give the same value to the variable token
?>
接下来,您将令牌回显到隐藏的表单中,就像您已经
一样<form action="#" method="post">
<input type="hidden" name="token" value="<?php echo $token ?>" />
<input type="text" name="textinput" />
<input type="submit" value="Submit" name="submit" />
</form>
在处理表单中,您需要做的就是检查$ _SESSION标记是否与$ _POST标记相同。
if($_POST['token'] == $_SESSION['token']){
//Do something
}
每当您打开主页面时,它都会更改会话变量。因此,仍然包含旧令牌的post值将不再与较新的Session令牌匹配。
这在我眼中更简单,并且不需要你为它创建一个函数。