首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中使用nonce作为安全解决方案

在PHP中使用nonce作为安全解决方案
EN

Stack Overflow用户
提问于 2014-04-11 04:31:48
回答 1查看 1.6K关注 0票数 0

目前,我在PHP中使用nonce作为安全解决方案存在问题。

我看了这篇关于How to check if a request if coming from the same server or different server?的文章

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

示例

代码语言:javascript
复制
<?
$_SESSION['formhash'] = md5('any value to be hashed');
?>
<input type="hidden" name="hashed" id="hashed" value="<?php echo $_SESSION['formhash']; ?>" />

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

图像显示示例

有什么更安全的方法吗?如有任何帮助,将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-11 05:05:15

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

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

有了这些知识,我们可以考虑以下情况:

  1. 典型的用例是用户提交表单而不修改数据。您的方法将允许您确认表单已由该用户发布。您的验证代码应该确认POST数据是可以接受的。
  2. 如果用户修改并提交表单数据,您的方法将允许您确认表单已由该用户发布,但而不是,即表单已被破坏。这就是为什么您需要非常非常仔细地验证表单的原因。
  3. 如果用户抓取了一个实际发送给其他人的表单,并发布它--修改或未修改--您的系统将允许您确认表单而不是来自最初发送给它的用户,您应该拒绝它。

场景3是我们所知道的CSRF攻击,您的解决方案是对此攻击的标准防御。

如@cHao所述,您应该为生成的每个表单重新生成散列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23003563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档