为啥 Firefox 并不总是为 POST 请求发送 HTTP Origin 标头?

Posted

技术标签:

【中文标题】为啥 Firefox 并不总是为 POST 请求发送 HTTP Origin 标头?【英文标题】:Why does Firefox not always send the HTTP Origin header for POST requests?为什么 Firefox 并不总是为 POST 请求发送 HTTP Origin 标头? 【发布时间】:2015-05-16 02:02:45 【问题描述】:

我正在https://www.drupal.org/node/1803712探索将 HTTP Origin 检查作为 Drupal 的 CSRF 保护的想法

现在我正在测试 Origin 标头如何通过 POST 请求到达,但 Firefox 不会在用户登录表单提交时发送 Origin 标头。 Chromium 和 Chrome 工作正常,它们发送 Origin 标头。

Firefox 版本是 36.0.1。我还使用干净的 Firefox 安装进行了测试,因为我认为我的一些浏览器插件可能会抑制 Origin 标头,但没有运气 - 那里也没有 Origin 标头。

是否有描述 Firefox 何时发送 Origin 标头以及何时不发送的文档页面?

【问题讨论】:

是的,这是一个很好的问题,我很惊讶没有任何答案,因为它基本上适用于所有 Web API 开发人员。它确实使 CSRF 保护比应有的复杂得多。 【参考方案1】:

尚未实施。这里有一个讨论:https://bugzilla.mozilla.org/show_bug.cgi?id=446344

【讨论】:

该问题显示“在 Firefox 59 中已解决”。没有测试。【参考方案2】:

Firefox 的默认设置是不发送 HTTP_ORIGIN。

原因是如果启用了network.http.sendOriginHeader 配置变量(可通过about:config 访问),则会导致某些移动Firefox 版本挂起的错误。 (详情见https://developer.mozilla.org/en-US/Firefox/Experimental_features#Security和Marco评论https://bugzilla.mozilla.org/show_bug.cgi?id=446344提供的链接。)

有提议默认开启FF发送HTTP_ORIGIN,但是TODO列表很长(见https://bugzilla.mozilla.org/show_bug.cgi?id=1424076)。 因此,即使没有启用 CSRF 的 javascript 代码,FF 通常也会发送 HTTP_ORIGIN 可能需要数年时间。

某些 FOSS 操作系统会预先配置其 FF 端口以默认发送 HTTP_ORIGIN。 顺便说一句,MS Edge 也不会在没有使用 Javascript 显式启用 CSRF 的情况下发送 HTTP_ORIGIN。

出于这个原因,我对我的网站实施了一项安全设置,使用户能够禁止来自不提供 HTTP_ORIGIN 的浏览器的 POST 事务。

【讨论】:

我不明白,因为 MDN 文档说“[...]我们目前只在 CORS 请求上发送 Origin。” developer.mozilla.org/en-US/docs/Mozilla/Firefox/… 但Origin 似乎没有发送attacker.com 中的form 具有victim.com 的操作和POST 的方法?!我错过了什么吗?

以上是关于为啥 Firefox 并不总是为 POST 请求发送 HTTP Origin 标头?的主要内容,如果未能解决你的问题,请参考以下文章

为啥复选框状态并不总是传递给 PHP 脚本?

firefox 31用啥版本的selenium IDE,为啥总是小小的画面,在网页的左边占一点点的位置

为啥不总是使用 HTTP post 进行 ajax 调用?

struts2如何指定是post请求还是get请求

为啥有时 Angular JS 在登录后立即得到 401?

为啥我的一个ajax请求总是被取消,回复data为空