Firefox os特权应用程序错误:在jquery 1.9.1上调用被csp阻止的eval()

时间:2013-05-30 02:49:38

标签: jquery eval content-security-policy firefox-os

我正在通过jQuery制作firefox OS webApp。

应用程序类型具有使用systemXHR的特权。

所以我在清单文件中定义权限。应用程序在模拟器上运行良好。

但是当我将应用程序推送到设备并单击任何按钮时,检测到CSP错误。

  

错误:错误:调用由CSP阻止的eval()   源文件:app://0cd689b3-a514-4a1c-b1c4-efe372189761/js/jquery-1.9.1.js   行:603

设备信息

  • 操作系统版本:1.1.0.0.-prerelease
  • 平台版本: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?

3 个答案:

答案 0 :(得分:3)

实际上在jquery中存在与此相关的未解决问题: http://bugs.jquery.com/ticket/13862

使用csp的Firefox OS特权应用程序如下: “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的框架。

答案 1 :(得分:2)

您可以在MDN上找到有关特权应用的CSP规则的信息:https://developer.mozilla.org/en-US/docs/Web/Apps/CSP

我认为通过包含unsafe-eval您导致此错误,因为您粘贴的CSP政策错误是抱怨不安全的评估。

答案 2 :(得分:1)

您可以使用XHR直接调用您的登录服务,而不是使用jQuery AJAX调用:

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

这样你就不会使用jQuery的eval()了。