Ошибка привилегированного приложения Firefox OS: вызов eval() заблокирован csp в jquery 1.9.1

Я делаю веб-приложение Firefox OS с помощью jQuery.

Тип приложения является привилегированным для использования systemXHR.

Поэтому я определяю разрешение в файле манифеста. Приложение хорошо работает на симуляторе.

Но когда я нажимаю приложение на устройство и нажимаю любую кнопку, обнаруживается ошибка CSP.

Ошибка: Ошибка: вызов eval() заблокирован CSP
Исходный файл: app://0cd689b3-a514-4a1c-b1c4-efe372189761/js/jquery-1.9.1.js Строка: 603

Информация об устройстве

  • Версия ОС: 1.1.0.0.-предварительная
  • версия платформы: 18.0
  • Информация о фиксации Git: 2013-05-01 19:48:40

Пример кода

<div data-role="page" id="signinPageId">
  <script src="js/signin_controller.js"></script>
  <div data-role="header">
    <h3>Sign In</h3>
    <a href="#" data-icon="arrow-l" data-rel="back">Back</a>
  </div>
  <div data-role="content">
    <a id="signinBtn" href="#" data-role="button" class="ui-disabled">Sign In</a>
  </div>
</div>

Другие коды скриптов описаны в signin_controller.js.

function enableSigninBtn(inputEl){
    if(inputEl.val().length==0){
        $("#signinBtn").addClass("ui-disabled");
    }
    else{
        $("#signinBtn").removeClass("ui-disabled");
    }
}
................
................
$('#signinPageId').on('pagebeforeshow',function(){
    $('#emailForm').bind('keyup',function(){
        if($(':input[type=password]').val().length)
        {
            enableSigninBtn($(this));
        }
    });
    $('#passwordForm').bind('keyup',function(){
        if($(':input[type=email]').val().length)
        {
            enableSigninBtn($(this));
        }
    });
    $('#signinBtn').bind('click',function(){
        initSignIn($(':input[type=email]').val(),$(':input[type=password]').val());
    });
});

Поэтому я определяю csp в файле манифеста

"csp" : "default-src *; script-src 'self' 'unsafe-eval'; object-src 'none'; style-src 'self' 'unsafe-inline'",
"default_locale": "en",
"type": "privileged",
"permissions": {
    "systemXHR": {
        "description": "Required for comunication with otehr sever"
        }
     }

Как я могу избежать этого csp?


person seong    schedule 30.05.2013    source источник


Ответы (3)


Вы можете найти информацию о правилах CSP привилегированных приложений на MDN: https://developer.mozilla.org/en-US/docs/Web/Apps/CSP

Я думаю, что, включив unsafe-eval, вы вызываете эту ошибку, потому что вставленная вами ошибка политики CSP жалуется на небезопасную оценку.

person Fred    schedule 30.05.2013
comment
Спасибо за ваш комментарий. Но нарушение csp происходит, кроме unsafe-eval. примерная страница не является первой страницей. поэтому я добавил тег ‹script› под страницу div. Это причина проблемы. Если я добавляю скрипт при загрузке страницы, происходит csp. Но если этот скрипт определен в document.ready первой индексной страницы, не нарушается. Но я хочу разделить скрипт на несколько файлов, как на странице примера выше. Также я пытался добавить динамически с помощью $.getScript. Но эта функция делает синтаксическую ошибку в функции первой строки. Если первая строка не является такой функцией, как $('selector'), возникает ошибка неправильного формата. - person seong; 31.05.2013
comment
На самом деле, включая unsafe-eval, вы разрешаете JS использовать eval(). Поэтому включите его, чтобы обойти эту проблему, или удалите eval во всех ваших JS. - person rugk; 01.08.2016

На самом деле существует открытый вопрос, связанный с этим в jquery: http://bugs.jquery.com/ticket/13862

Привилегированные приложения Firefox OS, использующие csp, например: «default-src *; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'"

(https://developer.mozilla.org/en-US/Apps/Developing/Packaged_apps)

Таким образом, вы не можете расслабить CSP с помощью этой строки в своем манифесте.

Единственный способ избежать этого — использовать инфраструктуру, совместимую с CSP.

person daf182    schedule 12.11.2013

Вместо использования вызова jQuery AJAX вы можете напрямую вызывать службу входа в систему, используя XHR, как:

var xhr = new XMLHttpRequest({mozSystem: true});

Таким образом, вы не будете использовать функцию jQuery eval().

person Eldelshell    schedule 04.06.2013