我正在尝试实现一个用户友好的反CSRF机制。
问题是我的应用程序将在多个选项卡中打开,并且令牌很可能在服务器上过期。
从服务器文件中获取新的csrf令牌是一种好习惯 得到-CSRF,token.php 因为无论如何攻击者无法从跨站点请求读取响应(考虑到jsonp和cors被禁用)
修改 我计划每个会话每小时保持单个CSRF令牌有效,并且Web应用程序将在一小时后重新请求新令牌
这种方法有什么问题吗?
答案 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调用无法正常工作的麻烦。