Выполнение скрипта через AJAX на устройстве Firefox OS

Мой вопрос касается CSP для приложений https://developer.mozilla.org/en-US/Apps/CSP

Здесь говорится, что все удаленные сценарии, встроенные сценарии, URI javascript и другие проблемы безопасности не будут работать в приложении Firefox OS.

Итак, я попытался загрузить скрипт, необходимый для моего приложения (сервис Flurry и Ad), и ни один из них не работал на устройстве. Я звонил с помощью AJAX, чтобы избежать удаленных и встроенных сценариев, которые используются в обоих сценариях. В симуляторе работает отлично, но на устройстве никогда не показывается реклама и не запускается сеанс Flurry.

Вот часть моего кода, где я делаю вызов AJAX для Flurry:

$.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:true} в вызове AJAX.

Я считаю, что это не междоменная проблема, потому что в остальной части моего приложения я делаю вызовы для файлов xml, которые не находятся в моем домене, и вызовы успешно возвращаются.

Итак, мой вопрос: может ли приложение Firefox OS выполнять сценарии, загружаемые через AJAX? Есть ли способ обойти эту проблему?

Спасибо за уделенное время.

PS: я забыл добавить, что мое приложение является привилегированным, на всякий случай, если вы спросите


person Mavi    schedule 18.11.2013    source источник
comment
Это происходит из-за того, что скрипт вообще не загружается или потому что скрипт (после успешной загрузки) делает что-то недопустимое?   -  person apsillers    schedule 19.11.2013
comment
@apsillers Скрипт вообще не загружается. Это потому, что приложение не может вызвать удаленный скрипт из соображений безопасности. Я попробую то, что вы сказали в своем ответе, и дам вам знать, как это происходит.   -  person Mavi    schedule 19.11.2013
comment
Этот скрипт не должен работать с CSP. Это только из-за ошибки в симуляторе. Если вы хотите использовать сторонний JavaScript в своем приложении, вы должны включить его в виде файла.   -  person freddyb    schedule 07.08.2014


Ответы (4)


Я считаю, что это функция безопасности, и краткий ответ на ваш вопрос будет НЕТ. Чтобы процитировать документ CSP, который вы связали с собой:

Вы не можете указать на удаленный файл JavaScript. Это означает, что все файлы JS, на которые вы ссылаетесь, должны быть включены в пакет вашего приложения.

Если вы загружаете файл JS с помощью ajax с удаленного сервера, этот JS не включается в пакет вашего приложения. Вы должны соблюдать ограничения CSP. Можно заставить многие вещи работать в симуляторе или даже на телефоне во время разработки без полного соответствия CSP, но это не значит, что это нормально. Когда вы в будущем отправите свое приложение на какой-либо заслуживающий доверия рынок (например, Firefox Marketplace), оно будет тщательно проверено, чтобы убедиться, что оно не нарушает ограничения CSP. Как правило, я бы сказал, что любая попытка динамической оценки кода JS будет представлять угрозу безопасности и, скорее всего, будет запрещена правилами CSP.

person Aras    schedule 18.11.2013
comment
Спасибо, я думал, что это, вероятно, единственный ответ на мою проблему... Итак, есть ли способ вызвать эти скрипты, не нарушая CSP? iframe может быть? - person Mavi; 18.11.2013
comment
@ Мави нет - на это уже ответили. Вы не можете использовать внешнюю загрузку JS и все! Никаких фреймов, тегов ‹script› с внешними источниками. Только локальные файлы js. - person Borislav Sabev; 21.11.2013
comment
Что ж, я попробовал iframe, и он загрузил внешний файл .js, но оказалось, что библиотека Flurry нарушила CSP (используя document.createElement() для создания скрипта, полученного извне моего проекта), так что ни как не получалось. Спасибо, в любом случае - person Mavi; 26.11.2013

Во-первых, я укажу, что ваши два примера не эквивалентны .

$.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. Однако мы все еще можем достичь этой цели с помощью URL-адреса 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, вам определенно не повезло.

person apsillers    schedule 18.11.2013
comment
Что ж, с iframe это работает, но скрипт сделал что-то, что не было разрешено CSP, поэтому у меня нет выхода. Спасибо, в любом случае - person Mavi; 26.11.2013

Вы должны использовать свойства mozSystem и mozAnon, например:

var xMLHttpRequest = новый XMLHttpRequest({ mozAnon: true, mozSystem: true });

person luiseduardohd    schedule 11.04.2014

Жаль, что это проблема, я надеялся, что loadScript заработает, так как firefoxOS - это среда, а в моем приложении весь код приложения HTML5 и локальный, текущее правило - все сценарии должны быть загружены в память в одном выстрел, если вы не загрузите URL-адрес полной страницы, что означает, что вы не можете иметь постоянную оболочку вокруг сайта и ajax на страницах с соответствующими сценариями, когда это необходимо. Вы могли бы подумать, что Firefox, по крайней мере, разрешит локальную ленивую загрузку для скриптов. в хроме работает, а в фаерфоксе нет.

person Cyberience    schedule 30.10.2014