双提交Cookies和多个标签?

时间:2014-06-15 01:03:55

标签: javascript cookies csrf

double-submit cookie机制需要使用cookie。但是,cookie在所有浏览器选项卡中共享。 如何在不破坏后退按钮和浏览器标签的情况下实现此机制?

含义:如果所有选项卡都使用相同的cookie来存储CSRF令牌,则每次打开新选项卡时,它都会破坏所有旧选项卡的cookie值。然后,当提交那些较旧选项卡中的表单时,它们将因令牌不匹配而失败。

另一方面,如果我每个标签使用一个单独的cookie,服务器将如何知道要查看哪个cookie?而且,如果您需要使用隐藏字段指向cookie名称,它是否会以某种方式打开您的新安全攻击(因为使用CSRF的攻击者可以更改表单值)?

更新

  • 实现需要无状态/ RESTful。没有服务器“会话”。
  • 您可以假设我控制所有子域名,因此攻击者将无法编写自己的Cookie。

2 个答案:

答案 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”值服务器端。

否则,如果未存储服务器状态:

  1. 对于针对MiTM的安全方法,必须生成此值 每个表单加载但在每次更改cookie值时都会中断选项卡 时间。
  2. 如果您不希望防范MiTM,您只需生成一次“CSRFCookie”值,这样就可以让多个标签/返回工作。
  3. 可能存在(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值的隐藏输入。