微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-使用哈希检查具有$_POST值的页面是否已刷新

当将表单发布到同一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...

这个解决方案有什么问题吗?

更新:这种情况的一个示例是在注册表中插入一行.您只希望该操作执行一次.

解决方法:

让我们从无法区分意外刷新和有目的刷新这一点开始.因此,您只能决定完全不允许刷新,或者换句话说,要求每个表单提交必须唯一.最好的方法是在表格中插入一个随机标记.

<?PHP
    $token = /* a randomly generated string */;
    $_SESSION['_token'] = $token;
?>
<input type="hidden" name="_token" value="<?PHP echo $token; ?>" />

每次提交后,您都将会话令牌无效.如果会话中的令牌与通过表单提交的令牌不同,则可以丢弃POST.

重新评论:您可以逐项执行此操作.例如,在SO上,您可能会打开几个问题窗口,并一次回答几个问题.您可以根据每个问题制作令牌,因此用户一次可以拥有多个有效令牌,但每个问题只能获得一个令牌.

An example for this scenario would be inserting a row into a registration table. You would only want this operation executing once.

在这种情况下,您可能不必太在乎实际的POST,而应在乎数据的一致性.您应该为每个用户提供某种形式的唯一标识,例如他的电子邮件地址.如果该地址已经在数据库注册,则无需再次注册用户.这与用户尝试注册两次(两次提交或实际尝试再次注册)的原因无关.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐