0

我目前在使用 nonce 作为 PHP 中的安全解决方案时遇到问题

我读了这篇关于 如何检查请求是否来自同一服务器或不同服务器的帖子?

关于使用隐藏的输入表单字段来散列随机值,同时将该随机值存储到与用户对应的会话中。提交表单后,检查隐藏字段的值是否与会话中存储的值相同。(我认为这有问题)

例子

<?
$_SESSION['formhash'] = md5('any value to be hashed');
?>
<input type="hidden" name="hashed" id="hashed" value="<?php echo $_SESSION['formhash']; ?>" />

拥有 Mozilla Firebug 并检查元素的用户仍会找到我的隐藏字段,然后将其复制。然后创建他/她自己的表单,然后将其发布到我的网址,登录仍然会被绕过。

显示示例的图像

在此处输入图像描述

有没有更安全的方法来做到这一点?任何帮助将不胜感激,谢谢!

4

1 回答 1

1

底线是您不能阻止用户在提交表单之前操作表单数据。您的解决方案所做的是确认表单数据来自您发送给的用户。

无论用户是否“登录”,每次有新访问者访问您的站点时,您都​​可能会启动一个会话。这意味着您可以在每次向他们发送表单时存储哈希值,并且理论上您应该能够将返回的表单数据上的哈希值与会话中的哈希值相关联(就像您的代码所做的那样)。

有了这些知识,我们可以考虑以下场景:

  1. 典型的用例是用户提交表单而不修改数据。您的方法将允许您确认该表单已由该用户发布。您的验证代码应确认 POST 数据是可接受的。

  2. 如果用户修改并提交了表单数据,您的方法将允许您确认表单已由该用户发布,但不能确认表单已被弄乱。这就是为什么您需要非常非常仔细地验证表单的原因。

  3. 如果用户抓取了实际发送给其他人的表单并将其发布(无论是否修改),您的系统将允许您确认该表单不是来自最初发送给的用户,您应该拒绝它。

场景 3 是所谓的 CSRF 攻击,您的解决方案是针对这种攻击的标准防御。

PS 正如@cHao 所说,您应该为您生成的每个表单重新生成哈希。

于 2014-04-11T05:05:15.223 回答