刷新CSRF令牌

Abh*_*wal 3 security csrf cross-domain

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

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

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

从 get-csrf-token.php 这样的服务器文件获取新的 csrf 令牌是一个好习惯吗?因为无论如何,攻击者无法读取跨站点请求的响应(考虑到 jsonp 和 cors 被禁用)

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

这种做法有什么问题吗?

Sil*_*Fox 5

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

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

请参阅这篇文章,了解一些 CSRF 机制的优点和缺点:Why is it common to put CSRF Prevention tokens in cookies?