javascript - 双重提交 Cookie 和多个选项卡?

标签 javascript cookies csrf

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

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

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

更新:

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

最佳答案

您可以创建每个用户 session 生成一次的特定 cookie。例如一个名为“CSRFCookie”。请务必设置 Secure Flag所以这只能通过 HTTPS 发送。

由于您不维护服务器状态,请注意这很容易受到 MiTM attacks 的攻击。因为我已经covered here :

Even if your site is only accessible over HTTPS and you correctly set the Secure Flag, care must be taken with this approach as an attacker could potentially MiTM any connection from the victim to any HTTP website (if the attacker is suitably placed of course), redirect them to your domain over HTTP, which is also MiTM'd and then set the required cookie value. This would be a Session Fixation attack. To guard against this you could output the cookie value to the header and the hidden form field every time this page is loaded (over HTTPS) rather than reuse any already set cookie value. This is because although a browser can set the Secure Flag, it will still send cookies without the Secure Flag over a HTTPS connection, and the server will not be able to tell whether the Secure Flag was set. (Cookie attributes such as the Secure Flag are only visible when the cookie is set, not when it is read. The only thing the server gets to see is the cookie name and value.)

因此,如果您希望防止出现这种情况并且不让您的网站在多个选项卡上崩溃,您必须跟踪服务器端的“CSRFCookie”值。

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

  1. 对于针对 MiTM 的安全方法,必须在 每个表单加载但随着 cookie 值的每次更改而中断选项卡 时间。
  2. 如果您不想防止 MiTM,您可以只生成一次“CSRFCookie”值,这将允许多个选项卡/返回工作。

对于 (1) 可能有一个解决方案,它涉及检查 cookie 值是否存在,如果存在,则在 cookie 值和隐藏表单字段的名称末尾递增一个数字。例如“CSRFCookie1 ”、“CSRFCookie2 ”等,因此每个表单都可以有自己的 cookie。请注意,这可能会产生大量数据,这些数据将随浏览器的每个 HTTP 请求一起提交到您的服务器(甚至图像、.js 等)。

另一种选择是使用 HSTS以确保浏览器始终在发出任何请求之前将任何到您服务器的 HTTP 连接重定向到 HTTPS。但是,在向您的服务器发出任何请求和设置 HSTS 策略之前,HTTP 连接仍有机会被中间人攻击。但是,您可以将您的网站安排在最流行浏览器的 HSTS 预加载列表中,以降低风险。这将使您能够在没有服务器状态的情况下使用多个选项卡,因为您只需使用相同的 cookie(“CSRFCookie”)和在未设置时生成的每个表单上的值,如果已设置则读取则永远不会重新生成。请注意IE暂不支持HSTS,但支持may be added in IE 12 ,然而see here for Edge browser support .

关于javascript - 双重提交 Cookie 和多个选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24225682/

相关文章:

javascript - 如何替换 ExtJS 中的组件

JavaScript 模块模式与构造函数中定义的方法的构造函数

javascript - for 循环中的动态变量名称

javascript - 检查客户端是否接受 javascript 中的 cookie?

ruby-on-rails - Firefox 中的 rails csrf 验证

django - 如何将 Django HttpResponse 转换为 Django 渲染调用

javascript - 遵循官方教程时webpack出错

javascript - 当我真正想要的时候,类型 'Object' 上不存在属性 - Angular2+

android - 如何在 chrome 自定义选项卡 android 中共享 cookie 数据

forms - Symfony 1.4 : Custom error message for CSRF in forms