禁用Firefox同源策略

131

我正在开发一个本地研究工具,需要我关闭Firefox的同源策略(就脚本访问而言,跨域请求并不重要)。

更具体地说,我想让宿主域中的脚本能够访问页面中嵌入的任意iframe中的任意元素,而不论它们的域名。

我知道以前的问答中提到了CORS FF扩展程序,但那不是我需要的,因为它只允许CORS,而不允许脚本访问。

如果不能轻松实现,我也会感激任何能指引我修改FF源代码以禁用SOP的见解,以便我可以重新编译FF。


4
对于开发人员来说,这将是一件有趣的事情。由于同源策略是为了用户安全而设计的,而不是为了开发人员,因此应该允许来自指定站点的脚本穿过限制。但开发人员也是人,所以您的个人信息也可能会泄露。 - Danubian Sailor
1
我认为现在不可能,这里是Firefox Bugzilla中相关的错误报告:https://bugzilla.mozilla.org/show_bug.cgi?id=1039678 - rutsky
唯一好的解决方案是基于域名的插件注入头文件:https://dev59.com/r2Qn5IYBdhLWcg3wIUBn#44093160。其他方法都不安全... - PiTheNumber
8个回答

91

有一个Firefox扩展可以将CORS头添加到任何HTTP响应中,适用于最新的Firefox(build 36.0.1),发布于2015年3月5日

我已经测试过了,在Windows 7和Mavericks上都可以工作。我会指导您完成使其工作的步骤。

1)获取扩展程序

您可以从此处(作者构建)或此处(镜像,可能不会更新)下载xpi文件。

或者从GitHub下载文件。 现在它也可以在Firefox Marketplace上下载:在这里下载。在这种情况下,单击安装后,插件将被安装,并且您可以跳过第4步。

如果您下载了xpi,则可以跳转到第3步。如果您从GitHub下载了zip,则请执行第2步。

2)构建xpi

您需要解压缩zip,进入“cors-everywhere-firefox-addon-master”文件夹,选择所有项目并将它们压缩成zip。 然后,将创建的zip重命名为 * .xpi

注意:如果您使用OS X gui,则可能会创建一些隐藏文件,因此最好使用命令行。

3)安装xpi

您可以将xpi拖放到Firefox中,或者转到:“about:addons”,单击右上角的齿轮图标,然后选择“从文件安装附加组件”,再选择您的 .xpi 文件。现在,重新启动firefox。

4)使其正常工作

现在,默认情况下扩展程序不会起作用。您需要将扩展程序图标拖到扩展程序栏中,但不要担心。这里有图片!

  • 点击Firefox菜单
  • 点击自定义

p1

  • 将CorsE拖到栏中
  • 现在,单击该图标,当它变为绿色时,CORS头将添加到任何HTTP响应中

p2

5)测试是否正常工作

jQuery

$.get( "http://example.com/", function( data ) {
  console.log (data);
});

JavaScript

xmlhttp=new XMLHttpRequest();

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
        console.log(xmlhttp.responseText);
    }
}

xmlhttp.open("GET","http://example.com/");
xmlhttp.send();

6) 最终考虑事项

请注意,https到http的访问是不允许的

可能有一些解决方法,但这超出了问题的范围。


3
您可以通过将security.mixed_content.block_active_content设置为falsesecurity.mixed_content.block_display_content设置为true来禁用HTTP/HTTPS混合内容保护。请记住,这会禁用一些安全功能,因此应该是一个临时解决方案。 - bufh
5
作为这个插件的作者,我并不确信它能解决这个特定的问题。虽然被提及还是很不错的。 - spenibus
3
@spenibus - 你应该让你的插件获得签名 - 我无法安装它 :( - https://support.mozilla.org/zh-CN/kb/add-on-signing-in-firefox?as=u&utm_source=inproduct - Peter Ajtai
3
我会尽力而为。这句话的意思是:Mozilla不断地试图让我感到恼怒,我正在等待审查:https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/,希望它可以被自动签名。 - spenibus
1
在 about:config 中将 xpinstall.signatures.required 设置为 false 以安装插件。这对我起作用了。 - user2345998
显示剩余8条评论

64
about:config -> security.fileuri.strict_origin_policy -> false

21
谢谢@Niklas,不过我认为这只是禁用了文件URI同源策略检查——可能只用于本地Web开发测试。但是,当我尝试从域A的JavaScript访问来自域B的iframe中的DOM节点时,它仍然阻止了我的操作。 - Yuchen Zhou
149
这并没有任何作用。 - vknyvz
2
确认它在我的 Firefox(开发者)版本 40 中可以工作。感谢 @Niklas 的提示。 - bufh
14
这是一个专门用于调试的设置,它控制了本地文件对其他本地文件的访问(将其设置为true时,本地文件只能访问同一文件夹或子文件夹中的本地文件,将其设置为false时,本地文件可以访问所有本地文件)。来源 - Jon Egerton
10
在我的情况下,它确实起到了作用,使我能够在通过“file://”协议传输的文档中访问本地资源。计算机科学家应该更加重视“任何”这个词--除非你已经测试了“一切”(而你没有),否则在发表评论时要更加保守。同样适用于“无用”这个词的使用。 - Armen Michaeli
显示剩余5条评论

14

我意识到我的旧回答被投票点踩是因为我没有具体说明如何禁用FF的同源策略。在这里,我将给出一个更详细的回答:

警告:这需要重新编译FF,并且新编译的Firefox版本将无法再次启用SOP。

查看Mozilla Firefox的源代码,在src目录中找到nsScriptSecurityManager.cpp文件。我将使用此处列出的一个作为示例:http://mxr.mozilla.org/aviarybranch/source/caps/src/nsScriptSecurityManager.cpp

进入函数实现nsScriptSecurityManager :: CheckSameOriginURI,该函数在日期03/02/2016时是第568行。

使该函数始终返回NS_OK。

这将永久禁用SOP。

@Giacomo提供的浏览器插件答案对大多数人应该很有用,我已经接受了那个答案,但是对于我的个人研究需求(TL;在此不解释),它还不够,我认为其他研究人员可能需要像我一样做这件事情来完全禁用SOP。


截至今天的第499行,Git镜像:https://github.com/mozilla/gecko-dev/blob/326e14fb760b2bdcdaa6b317ed38c7ef2ac34fdd/caps/nsScriptSecurityManager.cpp - kamranicus

10

2
谢谢你。此外,还有类似的CORS-Everywhere扩展程序 - nachtigall
它不起作用。我尝试启用它,但仍然出现错误,显示“跨域请求被阻止:同源策略禁止读取远程资源”。 - Donald Duck

5
cors-everywhere 插件在 Firefox 68 及之前版本可用,但在 68 版本及之后需要通过打开 'about:config' 并将 'privacy.file_unique_origin' 的值改为 false 来解决 'CORS request not HTTP' 错误,这是由于新的 CORS 同源规则引入所致。

注意:2021年12月更新,自 Firefox 95 开始,“CORS request not HTTP” 错误无法通过调整“privacy.file_unique_origin”来禁用。请参见上面的“CORS request not HTTP”链接,它已经由官方最近进行了更新。对我来说唯一的方法是“…需要执行本地测试的开发人员现在应该设置一个本地服务器。”


3

1
从https://wiki.mozilla.org/Add-ons/Extension_Signing: Firefox 48开始,发行版和Beta版的Firefox桌面版将不允许安装未签名的扩展,也没有覆盖选项。我找不到这个插件的签名版本。 - FelixM
1
@FelixM 这是如何操作的:https://www.ghacks.net/2016/08/14/override-firefox-add-on-signing-requirement/ - Khado Mikhal
@FelixM Firefox开发者版在“about:config”标志下有一个名为“xpinstall.signatures.required”的布尔选项。然而,此扩展的0.1.1版本不兼容Firefox Developer Edition 58.0(量子)。 - alxndr

1

对我来说,将content.cors.disable设置为false即可生效。


0
about:config 中添加 content.cors.disable(空字符串)。

1
这个有被测试过吗?从我所读的来看,这个 pref 的设计是在设置为 true 时使所有 CORS 请求失败,但没有涉及 false 或其他值。在 Firefox 中,禁用 CORS 的首选项是 content.cors.disable。将其设置为 true 将禁用 CORS,因此每当出现这种情况时,CORS 请求都会因此错误而失败。 - stealththeninja
截至Firefox 68.7版本,此设置甚至不可用。 - Gunnar Bernstein
在 Firefox 84 中找到了这个设置,但它并没有帮助我解决 Firefox 要求对外服务器有效的 CORS 策略的问题。 - Tim Daubenschütz
在FF85中存在content.cors.disable,但它是布尔类型,因此无法删除/编辑。 - a55

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接