我正在通过jQuery制作firefox OS webApp。
应用程序类型具有使用systemXHR的特权。
所以我在清单文件中定义权限。应用程序在模拟器上运行良好。
但是当我将应用程序推送到设备并单击任何按钮时,检测到CSP错误。
错误:错误:调用由CSP阻止的eval() 源文件:app://0cd689b3-a514-4a1c-b1c4-efe372189761/js/jquery-1.9.1.js 行:603
设备信息
示例代码是
<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?
答案 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()了。