double-submit cookie机制需要使用cookie。但是,cookie在所有浏览器选项卡中共享。 如何在不破坏后退按钮和浏览器标签的情况下实现此机制?
含义:如果所有选项卡都使用相同的cookie来存储CSRF令牌,则每次打开新选项卡时,它都会破坏所有旧选项卡的cookie值。然后,当提交那些较旧选项卡中的表单时,它们将因令牌不匹配而失败。
另一方面,如果我每个标签使用一个单独的cookie,服务器将如何知道要查看哪个cookie?而且,如果您需要使用隐藏字段指向cookie名称,它是否会以某种方式打开您的新安全攻击(因为使用CSRF的攻击者可以更改表单值)?
更新:
答案 0 :(得分:2)
您可以创建每个用户会话生成一次的特定Cookie。例如一个名为“CSRFCookie
”。请务必设置Secure Flag,以便仅通过HTTPS发送。
由于您没有维护服务器状态,请注意这是MiTM attacks,因为我covered here:
即使您的网站只能通过HTTPS访问并且您正确设置了Secure Flag,也必须谨慎使用此方法,因为攻击者可能会有任何从受害者到任何HTTP网站的连接MiTM(如果攻击者是当然适当放置),通过HTTP将它们重定向到您的域,这也是MiTM'd,然后设置所需的cookie值。这将是Session Fixation攻击。为防止这种情况发生,您可以在每次加载此页面时(通过HTTPS)将cookie值输出到标题和隐藏的表单字段,而不是重用任何已设置的cookie值。这是因为虽然浏览器可以设置安全标志,但它仍然会通过HTTPS连接发送没有安全标志的cookie,服务器将无法判断安全标志是否已设置。 (Cookie标识,例如安全标记仅在设置cookie时可见,而不是在读取时。可以看到服务器唯一看到的是cookie名称和值。)
因此,如果您希望防止此和在多个标签页上破坏您的网站,则必须跟踪“CSRFCookie
”值服务器端。
否则,如果未存储服务器状态:
CSRFCookie
”值,这样就可以让多个标签/返回工作。可能存在(1)的解决方案,其涉及检查cookie值是否存在,并且如果已经存在,则在cookie值和隐藏表单字段的名称的末尾增加数字。例如“CSRFCookie1
”,“CSRFCookie2
”等,因此每个表单都可以拥有自己的Cookie。请注意,这可能会产生大量数据,这些数据将随浏览器的每个HTTP请求一起提交到您的服务器(甚至图像,.js
等)。
另一个选项是使用HSTS确保浏览器始终在发出任何请求之前将任何到服务器的HTTP连接重定向到HTTPS。但是,在向服务器和HSTS策略集发出任何请求之前,仍有机会将HTTP连接设为MiTM。但是,您可以安排将您的网站放在HSTS预装的最流行浏览器列表中,以降低风险。这将使您能够使用没有服务器状态的多个选项卡,因为您只需使用相同的cookie(“CSRFCookie
”),并且如果未设置或读取,则生成的每个表单上的值(如果已设置然后从未重新生成)。请注意,IE 尚不支持HSTS,但支持may be added in IE 12 ,但see here for Edge browser support。
答案 1 :(得分:0)
此机制不要求您为每个页面请求生成新的doublecookie,仅适用于每个会话。由于攻击者无法读取其他网站的cookie,他们将无法制作具有适当doublecookie值的隐藏输入。