如何在Firefox附加组件中覆盖Facebook CSP

时间:2014-04-05 14:57:23

标签: facebook firefox content-security-policy

Facebook 必须更改其内容安全策略标题中的内容,因为我的Firefox加载项突然停止工作。

我需要使用 XMLHttpRequest 获取远程 XML 文件,而我的域当然不包含在Facebook CSP中(在Firefox控制台中,我看到一个错误使用页面的 connect-src 策略。直到今天,它才像魅力一样。

值得一提的是,Firefox附加组件不应受服务器CSP的影响(理论上这是这样)。

所以,我需要覆盖Facebook的CSP才能让我的附加组件再次运行。我找到了这段代码,但它适用于 Chrome扩展程序

chrome.webRequest.onHeadersReceived.addListener(function (details)
{
    for (i = 0; i < details.responseHeaders.length; i++) {
        if (details.responseHeaders[i].name.toUpperCase() == "X-WEBKIT-CSP") {
            details.responseHeaders[i].value = "default-src *;script-src https://*.feedhound.co https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://*.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl 'unsafe-inline' 'unsafe-eval' https://*.akamaihd.net http://*.akamaihd.net;style-src * 'unsafe-inline';connect-src https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://*.fbcdn.net *.facebook.net *.spotilocal.com:* https://*.akamaihd.net ws://*.facebook.com:* http://*.akamaihd.net https://*.feedhound.co";
        }
    }
    return {
        responseHeaders : details.responseHeaders
    };
}, {
    urls : ["*://*.facebook.com/*"],
    types : ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]
},
    ["blocking", "responseHeaders"]
);

有人可以帮我实现 Firefox 附加组件类似的东西吗?

我已经尝试了另一种方法,使用 setRequestHeader 添加我自己的“content-src”安全标头,但没有任何运气。

谢谢, 罗伯特

2 个答案:

答案 0 :(得分:3)

谢谢,与此同时我尝试了类似的解决方案,但我发现不幸的是,Mozilla 将不允许(我的修复程序已被评论者拒绝)。

问题是,通过使用 setResponseHeader 设置新的服务器响应来修改CSP标头可能会导致安全问题。

我想唯一可接受的解决方案是在chrome中运行代码而不是内容,因此它不会受到服务器CSP的影响。

这是我的修复:

var MYADDON_CSP_listener = {
observe : function(aSubject, aTopic, aData) {
  if (aTopic == "http-on-examine-response") {
    let url;

    aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
    url = aSubject.URI.spec;

    if (/https?:\/\/www.facebook.com\//.test(url)) {

        var csp = aSubject.getResponseHeader("content-security-policy");
        csp = csp.replace('connect-src', 'connect-src http://*.mywebsite.com https://*.mywebsite.com');
        aSubject.setResponseHeader("content-security-policy", csp, false);

    } 
  }
}
};
var MYADDON_observerService = Components.classes["@mozilla.org/observer-service;1"]
                                .getService(Components.interfaces.nsIObserverService);
MYADDON_observerService.addObserver(MYADDON_CSP_listener, "http-on-examine-response", false);

答案 1 :(得分:2)

我有同样的问题并且能够解决它。看看我在这里发布的解决方案 https://stackoverflow.com/a/19917664/297113

这可能对你有所帮助。