两次提交Cookie和多个标签?

吉利

双提交的cookie机制需要使用Cookie。但是,cookie在所有浏览器选项卡之间共享。如何在不破坏后退按钮和浏览器选项卡的情况下实现此机制?

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

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

更新

  • 实现必须是无状态/ RESTful的。没有服务器“会话”。
  • 您可以假设我控制了所有子域,因此攻击者将无法编写自己的cookie。
银光狐狸

您可以创建一个特定的cookie,该cookie在每个用户会话中生成一次。例如,一个名为“ CSRFCookie”的人。确保设置安全标志,以便仅通过HTTPS发送此标志

由于您不维护服务器状态,因此请注意,这很容易受到MiTM攻击,如我在此处所述

即使您的网站只能通过HTTPS访问并且您正确设置了安全标志,也必须谨慎使用此方法,因为攻击者可能会潜在地欺骗从受害者到任何HTTP网站的任何连接(如果当然适当地放置了攻击者),通过HTTP(也是MiTM)将其重定向到您的域,然后设置所需的Cookie值。这将是会话固定攻击。为了防止这种情况,您可以在每次加载该页面时(通过HTTPS)将cookie值输出到标题和隐藏的表单字段,而不是重用任何已经设置的cookie值。这是因为尽管浏览器可以设置安全标志,但仍会通过HTTPS连接发送没有安全标志的cookie,并且服务器将无法判断是否设置了安全标志。(仅当设置cookie时,才显示Cookie属性,例如Secure Flag,在读取cookie时不可见。服务器唯一看到的就是cookie名称和值。)

因此,如果您希望防止这种情况发生,并且希望通过多个选项卡中断站点,则必须跟踪“ CSRFCookie”价值服务器端。

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

  1. 对于MiTM的安全方法,此值必须在每次加载表单时生成,但是由于每次更改cookie值时都会中断制表符。
  2. 如果您不希望遭受MiTM的攻击,则只需生成CSRFCookie一次”值即可,该值将允许使用多个制表符/返回键。

对于(1),可能有一种解决方案,其中涉及检查cookie值是否存在,如果已经存在,则在cookie值和隐藏表单字段名称的末尾增加一个数字。例如“ CSRFCookie1”,“ CSRFCookie2”等,因此每种形式都可以有自己的cookie。请注意,尽管这样做可能会建立大量数据,浏览器将随每个HTTP请求将其提交到服务器(甚至是图像.js等)。

另一个选择是使用HSTS,以确保浏览器始终在发出任何请求之前始终将到服务器的任何HTTP连接重定向到HTTPS。但是,在对服务器和HSTS策略集发出任何请求之前,仍然有机会进行HTTP连接MiTM。但是,您可以将您的网站安排在最流行的浏览器的HSTS预加载列表中,以降低风险。这将使您能够使用多个选项卡而不使用服务器状态,因为您只需CSRFCookie在未设置的情况下生成的每个表单上使用相同的cookie(“ ”)和值,如果未设置则对其进行读取,如果已设置则将其读取,然后再也不会生成。请注意,HSTS尚未在IE浏览器的支持 ,但支持 可以在IE 12中添加 ,但有关Edge浏览器的支持,请参见此处

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章