CSRF令牌与Nonce混淆 - 它们是一样的吗?

Zub*_*ir1 14 php csrf nonce

在试图让我开发更安全的当前应用中,我一直在阅读有关CSRF令牌,并杜撰 - 我想我已经掌握了CSRF令牌背后的想法,但我无法找到"好和简体"资源和Nonces的例子.

我的问题很简单,CSRF令牌和Nonce是一样的吗?从目前为止我可以收集到的是,这两种方法都有不同的技术来实现相同的目标,还是我误解了什么?

如果它们不同,你是否足够好提供一些示例代码或指向我的一些链接,我可以在其中了解更多关于如何在PHP应用程序中实现nonce.

谢谢!

Kor*_*nel 15

不,他们不一样.

Nonce防止重放攻击(防止窃听者存储已签名的请求并在以后重新提交,例如,如果Alice发送"Pay Bob $ 100",您不希望有人重新发送100次).

CSRF令牌修补了用户操作身份验证中特定于HTML的弱点,第三方网站可以使用用户查看网站的凭据提交表单(例如,使用您的浏览器将evil.example.com提交表格的JavaScript提交给facebook.com,验证为您).

CSRF令牌需要保密,否则攻击者将拥有伪造请求所需的缺失部分.

如果它们与请求者的秘密签名(只要攻击者不能用一个nonce替换另一个nonce),则不必保密.

您可以允许使用CSRF令牌重播请求,并且仍然可以保护CSRF(您感兴趣的是这是否是用户的故意行为,但可能不一定要阻止用户多次执行).

事实上,这通常是有用的属性,例如允许用户使用"后退"按钮并重新提交具有更正值的表单.如果使用类似Nonce的机制实现CSRF保护,当用户刷新提交的页面时,您将收到错误警报.

在没有Nonce的情况下防止CSRF的简单方法是将会话ID放在隐藏的字段中(不是存储会话中的值,而是会话本身的ID,与存储在cookie中的相同[ session_id()在PHP中]).提交表单时,检查表单的会话ID是否与cookie中的ID匹配.这对CSRF来说已经足够了,因为攻击者无法知道cookie的价值(CSRF只允许攻击者盲目发送cookie).

  • 您不应该使用标识符(例如会话 ID)作为 CSRF 令牌,这允许攻击者通过例如要求将页面保存为 HTML 并嵌入仍然有效的会话 ID 来欺骗受害者。 (2认同)

zer*_*kms 13

Nonce通常是一些随机字符串,它被添加到请求只是以不可预测的方式改变数据,用于计算签名.因此,任何服务器端业务逻辑通常都不使用nonce.

虽然CSRF令牌存储在服务器上的某个位置,但是传递给客户端并需要返回到服务器进行比较.如果匹配 - 那么好的.

所以在你的情况下,最好将csrf令牌保存一次在会话变量中

$_SESSION['csrf_token'] = bin2hex(random_bytes(16));
Run Code Online (Sandbox Code Playgroud)

并在会话期间以您申请中的所有表格不变地使用它.

(如果没有random_bytes(),请使用random_compat对其进行填充.)


mar*_*rio 7

这是一回事."nonce"只是一次性密码本身.它可以作为加密盐,但基本上只是一个随机值.见WP:Nonce

但概括起来,乱数经常被用来作为 CSRF令牌.这是一个实现细节.与其他用例的区别在于它后来被断言.