gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:10:21 24 4
gpt4 key购买 nike

将表单发布到同一个 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; ?>" />

每次提交后,您都会使 session token 无效。如果 session 中的 token 与随表单提交的 token 不同,您可以丢弃 POST。

回复评论:您可以在每个项目的基础上执行此操作。例如,在 SO 上,您可能会打开多个问题窗口并一次回答多个问题。您可以在每个问题的基础上制作 token ,这样用户可以在任何时候拥有多个有效 token ,但每个问题只能有一个。

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

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

关于php - 使用散列检查具有 $_POST 值的页面是否已刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2650110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com