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

Правя firefox OS webApp от 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 commit: 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="/bg#" data-icon="arrow-l" data-rel="back">Back</a>
  </div>
  <div data-role="content">
    <a id="signinBtn" href="/bg#" 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. Но тази функция прави синтактична грешка във функция на първия ред. Ако първият ред не е функция като $('селектор'), възниква грешка, която не е добре оформена. - 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});

По този начин няма да използвате eval() на jQuery.

person Eldelshell    schedule 04.06.2013