我刚刚在 CSRF 上看到了Doctype 的插曲。
他们在其中说,CSRF 的最佳预防措施是从一些用户唯一数据(例如散列会话 ID)创建一个令牌,然后将其与您的请求一起发布。
生成一个难以猜测的值(例如 GUID)并将其存储为会话变量并将其作为隐藏字段放入页面中会不会更不安全?
每次加载页面时,该值都会更改,但 POSTed 数据的测试会在此之前进行。
在我看来,这同样安全。我错了吗?
令牌的来源可能并不那么有趣,只要它不可猜测或以任何方式确定即可。但请注意在每个请求上生成一个新令牌,因为这意味着您的网站将不适用于打开两个或更多浏览器选项卡到您的网站的用户。通过在用户会话期间坚持一个令牌值,您可以规避此问题。
每次请求都更改令牌可以说更安全。但罚款很可能被认为太高了。就像涉及安全性的几乎所有事情一样,您经常会发现您必须在用户体验的易用性方面做出权衡——给我找一个喜欢 CAPTCHA 的用户!为您的应用程序和用户找到合适的平衡点对您的安全性和可用性都很重要。
在Open Web Application Security Project上有一些关于 CSRF(以及更多)的好读物
还要记住,如果您在受令牌保护的页面上只有一个跨站点脚本漏洞,那么您的 CSRF 令牌现在就没有用了。另请参阅OWASP XSS(跨站点脚本)预防备忘单。