我的问题是关于应用CSP https://developer.mozilla.org/en-US/Apps/CSP
这里说所有远程脚本,内联脚本,javascript URI和其他安全问题都无法在Firefox OS应用程序上运行。
所以,我尝试下载我的应用程序所必需的脚本(Flurry和Ad服务),但这两种方法都无法在设备上运行。我打电话的方式是使用AJAX,这样我就可以避免脚本编写的远程和内联脚本。在模拟器中工作得很好,但在设备上,广告永远不会显示,而Flurry会话永远不会开始。
以下是我为Flurry进行AJAX调用的代码部分:
$.ajax({
url: 'https://cdn.flurry.com/js/flurry.js',
dataType: "script",
xhrFields: {
mozSystem: true
},
success: function(msg){
console && console.log("Script de Flurry: luego de la descarga en AJAX "+msg);
flurryLibrary = true;
FlurryAgent.startSession("7ZFX9Z4CVT66KJBVP7CF");
},
error:function(object,status,errortxt){
console && console.log("The script wasn't downloaded as text. The error:" +errortxt);
flurryLibrary = false;
},
always: function(object,status,errortxt){
console && console.log("The script may or may not be downloaded or executed. The error could be:" +errortxt);
}
});
在我的应用中,我使用systemXHR权限并使用此行拨打其他网站的电话:
request = new XMLHttpRequest({ mozSystem: true });
与在AJAX调用中使用xhrFields {mozSystem:true}相同。
我认为这不是一个跨域问题,因为在我的应用程序的其余部分中,我调用了不在我的域中的xml文件,并且成功返回了调用。
所以,我的问题是,Firefox OS应用程序可以执行通过AJAX下载的脚本吗?有办法解决这个问题吗?
感谢您的时间。
PS:我忘了添加我的应用程序是特权,以防你问
答案 0 :(得分:2)
我认为这是一个安全的功能,对你的问题的简短回答是否定的。引用您链接到自己的CSP文档:
您无法指向远程JavaScript文件。这意味着您引用的所有JS文件都必须包含在您的应用程序包中。
如果从远程服务器使用ajax加载JS文件,则该JS不包含在您的应用程序包中。您应该小心遵守CSP限制。在没有完全遵守CSP的情况下进行开发时,可以在模拟器甚至手机中使用很多东西,但这并不意味着它没问题。当您将来将应用程序提交到任何可靠的市场(例如Firefox Marketplace)时,将仔细审核以确保它不违反CSP限制。作为一般的经验法则,我认为任何动态评估JS代码的尝试都会带来安全风险,并且很可能被CSP法规禁止。
答案 1 :(得分:0)
首先,我会指出你的两个例子are not equivalent。
$.ajax({
xhrFields: {
mozSystem: true
},
});
与
相同request = new XMLHttpRequest();
request.mozSystem = true;
与
相同request = new XMLHttpRequest({ mozSystem: true });
相反,我们可以按照链接错误报告中的建议操作,并在应用程序加载时运行以下命令:
$.ajaxSetup( {
xhr: function() {
return new window.XMLHttpRequest( {
mozSystem: true
} );
}
} );
仅此一项就可以解决您的问题。但是,如果它不起作用,则此处的下一个解决方法是以纯文本格式获取脚本资源,然后将该文本内容作为脚本加载。
但是,内联脚本和data:
URL是特权Firefox OS应用程序的禁区。我们仍然可以通过blob:
网址实现此目标,但是:
window.URL = window.URL || window.webkitURL;
var request = new XMLHttpRequest({ mozSystem: true });
request.open("GET", "https://cdn.flurry.com/js/flurry.js");
// when the Ajax request resolves, load content into a <script> tag
request.addEventListener("load", function() {
// make a new blob whose content is the script
var blob = new Blob([request.textContent], {type: 'text/javascript'});
var script = document.createElement('script');
script.src = window.URL.createObjectURL(blob);
// after the script finishes, do something else
script.addEventListener("load", function() {
flurryLibrary = true;
FlurryAgent.startSession("7ZFX9Z4CVT66KJBVP7CF");
});
document.body.appendChild(script);
});
但是,如果脚本本身做了CSP不允许的事情,那么你肯定是运气不好。
答案 2 :(得分:0)
您必须使用mozSystem和mozAnon属性,例如:
var xMLHttpRequest = new XMLHttpRequest({ mozAnon:是的, mozSystem:是的 });
答案 3 :(得分:0)
很遗憾这是一个问题,我希望得到loadScript工作,因为firefoxOS是一个环境,而在我的应用程序中所有的应用程序代码都是HTML5和本地的,当前的规则是需要加载的所有脚本一次性内存,除非你url加载一个完整的页面,这意味着你不能在网站周围有一个持久包装器,并在需要时在带有相关脚本的页面中使用ajax。你会想到firefox至少会为脚本启用本地延迟加载。适用于chrome,但不适用于Firefox。