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