为了使我正在开发的当前应用程序更加安全,我一直在阅读有关 CSRF 令牌和 Nonce 的内容。
我的问题很简单,CSRF 代币和 Nonce 是同一个东西吗?到目前为止我所能收集到的是,这两种方法都有不同的技术来实现相同的目标,还是我误解了什么?
如果它们不同,您能否提供一些示例代码或向我指出一些链接,在这些链接中我可以了解有关如何在 PHP 应用程序中实现随机数的更多信息。
谢谢!
不,它们不一样。
Nonces 防止重放攻击(防止窃听者存储签名的请求并稍后重新提交,例如,如果 Alice 发送“向 Bob 支付 100 美元”,您不希望有人重新发送 100 次)。
CSRF 令牌修补了用户操作身份验证中特定于 HTML 的弱点,其中第 3 方网站可以提交带有查看该网站的用户凭据的表单(例如,使用浏览器在 evil.example.com 上向 facebook.com 提交表单的 JavaScript,经过身份验证你)。
CSRF 令牌需要保密,否则攻击者将拥有伪造请求所需的缺失部分。
如果使用请求者的秘密进行签名,则 Nonce 不必是秘密的(只要攻击者无法用另一个 Nonce 替换一个 Nonce)。
您可以允许使用 CSRF 令牌重放请求,并且仍然能够防范 CSRF(您感兴趣这是否是用户有意执行的操作,但可能不一定希望阻止用户多次执行该操作)。
事实上,这通常是有用的属性,例如允许用户使用后退按钮并重新提交具有更正值的表单。如果您使用类似 Nonce 的机制实现 CSRF 保护,当用户刷新提交的页面时,您会收到误报。
在没有 Nonce 的情况下防止 CSRF 的一个简单方法是将会话 ID 放入隐藏表单字段中(不是存储在会话中的值,而是会话本身的 ID,与存储在 cookie [session_id()
] 中的 ID 相同) PHP])。提交表单后,检查表单的会话 ID 是否与 cookie 中的 ID 匹配。这对于 CSRF 来说已经足够了,因为攻击者无法知道 cookie 的
value(CSRF 只允许攻击者盲目发送 cookie)。