为了使我正在开发的应用程序更加安全,我一直在阅读有关CSRF令牌和Nonce的内容。
我的问题很简单,CSRF令牌和Nonce是相同的吗?据我目前所了解的,这两种方法具有不同的技术来实现相同的目标,或者我有什么误解吗?
如果它们是不同的,请您提供一些示例代码或指向一些链接,让我了解如何在PHP应用程序中实现随机数。谢谢!
Nonce通常是一些随机字符串,添加到请求中只是为了以不可预测的方式更改用于计算签名的数据。因此,Nonce通常不由任何服务器端业务逻辑使用。
而CSRF-token存储在服务器的某个位置上,传递给客户端并需要返回到服务器进行比较。如果匹配,则OK。
因此,在您的情况下,更好的方法是将Csrf令牌保存在会话变量中:
$_SESSION['csrf_token'] = bin2hex(random_bytes(16));
在您的应用程序中,在会话生命周期内以所有形式不加修改地使用它。
(如果您没有random_bytes()
,请使用random_compat进行兼容性填充。)
getCsrfToken()
,在需要时返回一个值,并且按需创建(存储在会话中),仅在需要时创建。无需担心删除它。关于nonce:我只知道如何在API中使用nonce,在与用户(浏览器)和服务器的常规互联场景中不适用。 - zerkmsif($_POST['csrf_token'] == getToken())
。如果是真的 - 那么一切正常。 - zerkms这其实是同一件事情。"Nonce"仅仅是一个一次性的密码本身,可以作为加密盐使用,但基本上只是随机值。请参见WP:Nonce。
简单来说,Nonce通常被用作CSRF令牌。它是一种实现细节。与其他用例的区别在于,它稍后会被断言。
CSRF 有一些限制。 如果您有需要在新标签页中打开任何页面或链接的要求,则 CSRF 不允许。现有令牌仅允许在新标签页中打开页面 5 次。 当您尝试第 6 次打开时,它将创建一个新令牌,该令牌将与“服务器端=客户端令牌”不匹配。早期令牌将过期,并将创建新令牌(NONCE),在这种情况下,您将收到 404 或 405 错误。