我有一个场景,我已经拥有CSRF令牌,但我必须删除。在电子商务中,产品页面由Varnish缓存,因此如果用户直接在此处登陆,则他将没有会话ID来验证令牌。在这个页面中,我有一个“添加到购物车”按钮,它有CSRF令牌,但当然它是用错误的令牌缓存的。
我的问题是:还有另一种方法可以在不依赖于使用令牌隐藏的输入的情况下获得CSRF保护吗?必须缓存放置按钮的页面,因此在这种情况下令牌不好。
感谢。
答案 0 :(得分:3)
要使CSRF令牌生效,您需要能够在cookie机制之外提交它。您可以让您的页面对您的站点执行AJAX POST,以便检索CSRF令牌。
e.g。 https://www.example.com/GetCSRFToken
响应:
{ "token": "abcdefg" }
然后,您就可以在表单中提交此令牌。由于这是一个单独的请求,因此响应不会成为缓存页面的一部分。此方法的唯一缺点是必须启用JavaScript才能检索令牌。您可能有可能处理此方案,并且如果由于JavaScript被禁用而没有令牌而对表单进行POST,则可以在将实际项目添加到购物车之前添加确认步骤。确认页面将被设置为不被缓存,因此每个用户总是会获得会话的令牌。
答案 1 :(得分:1)
在OWASP CSRF预防作弊表中有一个名为"Double Submit Cookies"
的替代方案它使用表单提交会话ID,其中javascript读取此cookie值并将其作为隐藏的输入元素注入表单。为此,您的会话cookie不得标记为HTTPOnly
,这是一种不好的做法。因此,在尝试在CSRF上添加一些时,会丢失一些会话cookie安全性。
作为对此方法的改进,您可以使用登录创建另一个存储CSRF令牌值的cookie,并使用此cookie而不是sessionid
cookie。现在,您可以将sessionid cookie标记为HTTPOnly
。 (不将csrf cookie标记为httponly也是一种不好的做法,但不像以前那样严重)
(我假设在每个页面上通过AJAX调用检索csrf令牌不是出于性能原因的选项)
答案 2 :(得分:-1)
您可以将Cookie用于CSRF,Cookie会在表单页面上设置并在下一页上进行检查。它可能需要一些调整,但它会绕过缓存。
不要忘记配置Varnish以不丢弃该cookie。