Firefox addon 如何向Firefox扩展添加内容安全策略
我有一个插件,我必须同时支持Chrome和Firefox浏览器。该插件进行跨脚本加载Firefox addon 如何向Firefox扩展添加内容安全策略,firefox-addon,Firefox Addon,我有一个插件,我必须同时支持Chrome和Firefox浏览器。该插件进行跨脚本加载 在Chrome中,通过在manifest.json文件中添加内容安全策略,我可以摆脱它。Firefox扩展如何实现?未来有计划在SDK()中以本机方式添加内容策略,但是有一个第三方模块可以让你接近你想要的位置:我找不到一个简单的解决方案来解决我的问题,在查找一些firefox插件扩展时,我不得不提出我自己的解决方案,如下所示。下面的解决方案在FF 24.0上进行了测试,但也适用于其他版本 Cc["@mozill
在Chrome中,通过在manifest.json文件中添加内容安全策略,我可以摆脱它。Firefox扩展如何实现?未来有计划在SDK()中以本机方式添加内容策略,但是有一个第三方模块可以让你接近你想要的位置:我找不到一个简单的解决方案来解决我的问题,在查找一些firefox插件扩展时,我不得不提出我自己的解决方案,如下所示。下面的解决方案在FF 24.0上进行了测试,但也适用于其他版本
Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService)
.addObserver(_httpExamineCallback, "http-on-examine-response", false);
function _httpExamineCallback(aSubject, aTopic, aData) {
var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
if (httpChannel.responseStatus !== 200) {
return;
}
var cspRules;
var mycsp;
// thre is no clean way to check the presence of csp header. an exception
// will be thrown if it is not there.
// https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIHttpChannel
try {
cspRules = httpChannel.getResponseHeader("Content-Security-Policy");
mycsp = _getCspAppendingMyHostDirective(cspRules);
httpChannel.setResponseHeader('Content-Security-Policy', mycsp, false);
} catch (e) {
try {
// Fallback mechanism support
cspRules = httpChannel.getResponseHeader("X-Content-Security-Policy");
mycsp = _getCspAppendingMyHostDirective(cspRules);
httpChannel.setResponseHeader('X-Content-Security-Policy', mycsp, false);
} catch (e) {
// no csp headers defined
return;
}
}
};
/**
* @var cspRules : content security policy
* For my requirement i have to append rule just to 'script-src' directive. But you can
* modify this function to your need.
*
*/
function _getCspAppendingMyHostDirective(cspRules) {
var rules = cspRules.split(';'),
scriptSrcDefined = false,
defaultSrcIndex = -1;
for (var ii = 0; ii < rules.length; ii++) {
if ( rules[ii].toLowerCase().indexOf('script-src') != -1 ) {
rules[ii] = rules[ii] + ' <My CSP Rule gets appended here>';
scriptSrcDefined = true;
}
if (rules[ii].toLowerCase().indexOf('default-src') != -1) {
defaultSrcIndex = ii;
}
}
// few publishers will put every thing in the default (default-src) directive,
// without defining script-src. We need to modify those as well.
if ((!scriptSrcDefined) && (defaultSrcIndex != -1)) {
rules[defaultSrcIndex] = rules[defaultSrcIndex] + ' <My CSP rule gets appended here>';
}
return rules.join(';');
};
Cc[“@mozilla.org/observer service;1”].getService(Ci.nsIObserverService)
.addObserver(_HttpTesteCallback,“http检查响应”,false);
功能检查回调(对象、特应性、aData){
var httpChannel=asObject.QueryInterface(Ci.nsIHttpChannel);
如果(httpChannel.responseStatus!==200){
返回;
}
var规则;
var-mycsp;
//这不是检查csp头是否存在的干净方法。异常
//如果它不在那里,将被抛出。
// https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIHttpChannel
试试{
cspRules=httpChannel.getResponseHeader(“内容安全策略”);
mycsp=_GetCSPaendingMyHostDirective(cspRules);
httpChannel.setResponseHeader('Content-Security-Policy',mycsp,false);
}捕获(e){
试一试{
//回退机制支持
cspRules=httpChannel.getResponseHeader(“X-Content-Security-Policy”);
mycsp=_GetCSPaendingMyHostDirective(cspRules);
httpChannel.setResponseHeader('X-Content-Security-Policy',mycsp,false);
}捕获(e){
//没有定义csp头
返回;
}
}
};
/**
*@var cspRules:内容安全策略
*对于我的要求,我必须将规则仅附加到“scriptsrc”指令。但是你可以
*根据需要修改此功能。
*
*/
函数_GetCsAppendingMyHostDirective(cspRules){
var rules=cspRules.split(“;”),
scriptSrcDefined=false,
defaultSrcIndex=-1;
对于(var ii=0;ii
Fyi,这确实有效,但Mozilla不会接受它进入插件库(我刚刚尝试过)。@AchalDave他们的原因是什么?告诉编辑器必须这样做,否则我们无法导入jquery库chartjs库等。没有其他方法。要么编辑认为你在做一些恶意的事情,你必须证明你不是,要么他认为你在做一些你不是的事情。那就跟那个家伙谈谈。或者你可能在不需要的时候这样做。我试着询问审稿人和#extdev频道,两个地方都告诉我不能使用远程代码,我需要将我使用的脚本与插件捆绑在一起。例如,对于jQuery,这很好,但我不知道如何使用MathJax实现这一点,因为脚本依赖于服务器端的许多东西(看起来)。这是在后台脚本还是在内容脚本中实现的?也许您有一些示例源代码可以向我们指出。@N-ate很抱歉,我没有它的任何代码示例。我已经很长时间没有使用它了,不确定当前的浏览器版本是否支持它。据我记忆所及,它必须在后台脚本中完成。干杯