【发布时间】:2012-02-23 11:59:34
【问题描述】:
这就是我想做的:
防止用户使用唯一令牌两次提交表单。我想我在这里有正确的代码,但它仍然不起作用。第一次提交表单时,输出为“不要发送两次”。我究竟做错了什么?
<?php session_start(); ?>
<html>
<body>
<?php
$_SESSION['token'] = md5(session_id() . time());
?>
<?php
if (isset($_SESSION['token']))
{
if (isset($_POST['token']))
{
if ($_POST['token'] != $_SESSION['token'])
{
echo "Don't send twice!";
}
}
}
else {
echo "Thank you for submitting";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>" />
<input type="text" name="bar" />
<input type="submit" value="Save" />
</form>
【问题讨论】:
-
你在每次页面加载时创建一个新的$_SESSION['token'](“time()”的值不断变化),所以条件总是满足的。
-
表单提交后重定向到同一页面,防止表单重新提交
-
@Rémi 我将令牌更改为... $_SESSION['token'] = md5(uniqid());...但我仍然有同样的问题,它说“不要发送两次“我第一次提交。你能展示一些代码示例吗?
-
这不是重点。您在每个请求中重新生成一个新的会话令牌(无论是第一个 GET 还是后面的 POST),因此这些条件“if (isset($_SESSION['token']))”和“if ($_POST[ 'token'] != $_SESSION['token'])" 总是正确的。仅在令牌不存在时才生成令牌,并且您应该开始获得更好的结果。同样正如前面的评论所建议的,为了防止重新提交,使用redirect after post 模式更容易。
-
好吧,你受够了,不知道我是否知道如何创建一个不存在的令牌,但我会尝试重定向后发布模式!