刷新 CSRF 代币



我正在尝试实现一个用户友好的反CSRF机制。

  1. 目前,我的应用程序使用反 csrf 令牌设置一个 cookie 和会话变量并将其发送给用户。
  2. 每当用户发出不安全的请求(POST,DELETE,PUT)javascript都会读取cookie并将令牌添加到通过ajax请求发送的表单中。
  3. 在服务器上,将表单值与会话包含的值进行比较。

问题是我的应用程序将在多个选项卡中打开,并且令牌很可能会在服务器上过期。

从服务器文件中获取新的 csrf 令牌是否是一种好习惯,例如获取CSRF令牌.php因为无论如何攻击者无法读取跨站点请求的响应(考虑到 jsonp 和 cors 被禁用)

编辑:我计划在每个会话中保持每小时有效的单个 CSRF 令牌,Web 应用程序将在一小时后重新请求新令牌

这种方法有什么问题吗?

每个用户会话只需要一个 CSRF 令牌。由于任何攻击者都无法读取令牌,因此在下一个会话处于活动状态之前,您无需刷新令牌。这意味着在多个选项卡中打开应用程序不会有问题。

您的方法是同步器令牌模式 CSRF 保护机制的实现,这是 OWASP 推荐的方法。由于 JavaScript 用于向请求添加值,因此您无法将 cookie 标记为 httpOnly 。这可以防止任何XSS漏洞允许攻击者获取您的cookie值。但是,如果您确实有任何XSS漏洞,这些漏洞比CSRF漏洞稍微严重一些,无论如何都应该立即解决,因为一旦发现XSS漏洞,还有其他攻击媒介。

请参阅这篇文章,了解一些 CSRF 机制的一些优缺点:为什么将 CSRF 预防令牌放在 cookie 中很常见?

在我的项目中,我使用 cookie 来管理用户的身份验证,并使用会话来生成 CSRF 令牌。

生成表单时,应将其包含在隐藏字段中。例如:

<form method="post" action="/paymoney">
   <input type="hidden" name="csrf" value="csrf value" />
   ...
</form>

当用户发出请求时,服务器应首先对请求进行身份验证(通过cookie)。之后,服务器获取正确的用户会话并验证 CSRF 令牌。请注意,您应该关心CSRF令牌的时间。此令牌的过期时间越长,您获得的效率就越低。但是如果过期时间太短,则会导致一些ajax调用无法工作的麻烦,尽管用户的身份验证仍然有效。

相关内容

  • 没有找到相关文章

最新更新