编程语言
首页 > 编程语言> > php-使用哈希检查具有$_POST值的页面是否已刷新

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,而应在乎数据的一致性.您应该为每个用户提供某种形式的唯一标识,例如他的电子邮件地址.如果该地址已经在数据库中注册,则无需再次注册用户.这与用户尝试注册两次(两次提交或实际尝试再次注册)的原因无关.

标签:forms,post,form-submit,hash,php
来源: https://codeday.me/bug/20191106/2000384.html