火狐OS设备上执行通过AJAX脚本(Executing a script via AJAX on F

2019-10-19 00:28发布

我的问题关于应用CSP https://developer.mozilla.org/en-US/Apps/CSP

这表示,所有的远程脚本,内联脚本,javascript中的URI,和其他安全问题不会在一个Firefox OS的应用程序工作。

所以,我试图下载一个脚本,需要我的应用程序(乱舞和广告服务),并没有在设备上是可行的。 我提出的要求的方式是用AJAX,这样,我会避免遥控器和内嵌脚本,这两个脚本换货。 在模拟器完美的作品,但在设备上的广告从不显示,从来没有开始乱舞会议。

这里是我做的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 });

至极相同使用xhrFields {mozSystem:真正}在AJAX调用。

我相信这不是一个跨域问题,因为在我的应用程序的其余部分我做出不在我的域名的XML文件的调用,并调用成功地返回。

所以,我的问题是,可以在火狐OS的应用程序执行,它们通过AJAX下载的脚本? 有没有办法来解决这个问题呢?

感谢您的时间。

PS:我忘了补充一点,我的应用程序是特权,以防万一你问

Answer 1:

我认为是一个安全功能和短回答你的问题就没有。 引用你链接到自己的CSP文档:

你不能在远程JavaScript文件指向一个。 这意味着,您引用的所有JS文件必须包含在你的应用的程序包。

如果您使用从远程服务器的AJAX,那JS不包含在你的应用程序包加载JS文件。 你应该小心遵守CSP的限制。 这是可能得到的东西在模拟器甚至手机工作时不完全符合于CSP发展,但这并不意味着它是确定。 当您在将来提交应用到任何可信的市场(如Firefox市场),将仔细审查,以确保它不违反CSP限制。 作为一般的经验法则,我会说,在动态评估JS代码的任何尝试都将是一个安全隐患,最有可能通过CSP法规禁止的。



Answer 2:

首先,我要指出的是,你的两个例子是等价的 。

$.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: URL,但是:

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允许的,那么你肯定是出于运气。



Answer 3:

您必须使用mozSystem和mozAnon特性,例如:

变种的XMLHttpRequest =新的XMLHttpRequest({mozAnon:真,mozSystem:真});



Answer 4:

它是一种耻辱,这是一个问题,我希望在得到loadScript工作,作为firefoxOS是一个环境,在我的应用,该应用程序代码是HTML5和地方,目前的规则是所有的脚本需要在内存中加载一个出手,除非你的网址加载整个页面,这意味着在需要的时候,你不能在工地附近的一个persisten包装和Ajax在矿井用的产生密切相关脚本的网页。 你会想到,火狐将至少启用了脚本本地延迟加载。 工作在铬,但不是在Firefox浏览器。



文章来源: Executing a script via AJAX on Firefox OS device