刷新CSRF令牌

时间:2015-01-26 12:13:18

标签: security cross-domain csrf

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

  1. 目前,我的应用程序使用anti-csrf令牌设置cookie和会话变量,并将其发送给用户。
  2. 每当用户发出不安全的请求(POST,DELETE,PUT)时,javascript会读取cookie并将令牌添加到通过ajax请求发送的表单中
  3. 在服务器上,将表单值与会话包含的值进行比较。
  4. 问题是我的应用程序将在多个选项卡中打开,并且令牌很可能在服务器上过期。

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

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

    这种方法有什么问题吗?

2 个答案:

答案 0 :(得分:2)

每个用户会话只需要一个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?

答案 1 :(得分:0)

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

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

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

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