当将表单发布到同一个PHP页面时,正确的方法是什么来查找页面是否被意外刷新而不是再次提交?
这是我现在正在使用的:
$tmp = implode('',$_POST);
$myHash = md5($tmp);
if(isset($_SESSION["myHash"]) && $_SESSION["myHash"] == $myHash)
{
header("Location: index.php"); // page refreshed, send user somewhere else
die();
}
else
{
$_SESSION["myHash"] = $myHash;
}
// continue processing...
这个解决方案有什么问题吗?
UPDATE:此场景的一个示例是将行插入注册表。您只想执行一次此操作。
先从你无法区分的点说起偶然刷新自有目的的刷新。所以你只能决定根本不允许刷新,或者换句话说要求每个表单提交必须是唯一的。最好的方法是将随机标记插入表单中。
<?php
$token = /* a randomly generated string */;
$_SESSION['_token'] = $token;
?>
<input type="hidden" name="_token" value="<?php echo $token; ?>" />
每次提交后,您都会使会话令牌失效。如果会话中的令牌与随表单提交的令牌不同,您可以放弃 POST。
回复评论:您可以针对每个项目执行此操作。例如,在此处,您可能会打开多个问题窗口并同时回答多个问题。您可以针对每个问题创建令牌,因此用户可以随时拥有多个有效令牌,但每个问题只能有一个。
此场景的一个示例是将行插入注册表。您只想执行一次此操作。
在这种情况下,您可能不应该太关心实际的 POST,而应该关心数据一致性。您应该为每个用户提供某种形式的唯一标识,例如他的电子邮件地址。如果该地址已在数据库中注册,则无需再次注册该用户。这与用户尝试注册两次的原因无关(双重提交或实际尝试再次注册)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)