【问题标题】:Refreshing CSRF Tokens刷新 CSRF 令牌
【发布时间】:2015-03-24 20:29:24
【问题描述】:

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

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

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

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

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

这种方法有什么问题吗?

【问题讨论】:

  • 需要更多帮助吗?如果是这样,我会更新我的答案。

标签: security cross-domain csrf


【解决方案1】:

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

您的方法是Synchronizer Token Pattern CSRF 保护机制的实现,这是 OWASP 推荐的方法。由于 JavaScript 用于将值添加到请求中,因此您不能将 cookie 标记为 httpOnly。这将阻止任何 XSS 漏洞允许攻击者获取您的 cookie 值。但是,如果您确实有任何 XSS 漏洞,这些漏洞比 CSRF 漏洞稍微严重一些,无论如何都应该立即解决,因为一旦发现 XSS 漏洞就会有其他攻击媒介。

有关某些 CSRF 机制的优缺点,请参阅此帖子:Why is it common to put CSRF prevention tokens in cookies?

【讨论】:

  • "每个用户会话只需要一个 CSRF 令牌。"总是这样吗?我最近不得不编写一个“心跳”JS 脚本来刷新 CSRF 令牌,因为它在我的会话之前就过期了。谢谢
【解决方案2】:

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

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

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

当用户发出请求时,服务器应首先验证请求(通过 cookie)。之后,服务器获取正确的用户会话并验证 CSRF 令牌。 请注意,您应该关心 CSRF 令牌的超时时间。此令牌的过期时间越长,您获得的效率就越低。但是如果过期时间太短,就会造成一些ajax调用不能工作的麻烦,虽然用户的认证仍然有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 2017-11-27
    • 2021-09-10
    • 2021-01-22
    • 2021-08-20
    • 1970-01-01
    • 2022-10-31
    • 2016-01-05
    相关资源
    最近更新 更多