我正在测试一个web应用程序。CSRF在cookie和标头中应用和发送,但不以隐藏输入的形式发送。csrf令牌不会对每个请求都更改,但会在会话期间更改。csrf令牌应该多久更改一次?它应该按会话还是按请求更改?客户端还是服务器应该设置csrf令牌?应用csrf保护的最佳策略是什么?双重提交cookie?三重提交Cookie?或者任何其他新策略?
我只是想在这里逐一回答您的问题。
CSRF令牌应该多久更改一次?
您可以在每个会话中更改一次CSRF令牌。每次请求更改一次并没有带来真正的安全优势,如果有的话,这只是浪费资源和限制可用性的一种简单方式。例如,用户将无法点击"返回"按钮,因为他们将有一个过时的CSRF令牌,或者如果他们试图重新提交具有新值的表单(例如在验证错误后(,该表单可能不会发送。
它应该按会话还是按请求更改?
如前所述,它应该在每个会话中更改。用户每次请求只能在登录时获得一个新令牌。这是为了防止会话固定攻击导致CSRF攻击的可能性。
例如:攻击者访问站点并生成新会话。他们获取会话ID并将其注入受害者的浏览器(例如,通过从易受攻击的邻居域写入cookie,或使用另一个漏洞(如jsessionid URL((,还将CSRF令牌注入受害者浏览器中的表单。他们等待受害者使用该表单登录,然后使用另一个表单帖子让受害者使用仍然有效的CSRF令牌执行操作。
为了防止这种情况,请使CSRF令牌无效,并在您已经对会话ID进行了相同操作的地方(如登录(发布一个新令牌,以防止会话固定攻击。
客户端还是服务器应该设置CSRF令牌?
服务器-始终在服务器上您希望根据OWASP准则从可信来源生成令牌。这样可以确保您准确地知道令牌的生成位置,并限制攻击面,因为攻击者无法控制服务器上发生的事情。
应用CSRF保护的最佳策略是什么?
我认为CSRF是一个非常深入的话题,不能用几个字来概括。这就是一点研究和阅读可以起到很大作用的地方。我建议你看一下OWASP CSRF预防作弊表。