我正在制作一个Chrome扩展程序,该扩展程序使用JQuery通过ajax调用来访问Wikipedia的API。我已经在扩展的本地js文件夹中包含了JQuery的副本。在弹出窗口中,我输入了一个值,然后在popup.js中获取该值并执行get请求,并且我收到了“拒绝加载脚本,因为它违反了以下内容安全策略指令:” script-src'self'blob :filesystem:chrome-extension-resource:“。请注意,未明确设置'script-src-elem',因此将'script-src'用作备用。”
我在WebRequest and <all_urls>
文件的权限中设置了manifest.json
。这是清单中我的权限:"permissions": [
"tabs",
"webNavigation",
"webRequest",
"<all_urls>",
"https://en.wikipedia.org/*"
],
我看到添加一个"content_security_policy": "script-src-elem 'self' https://www.wikipedia.org/"
可以使其更容易,但是并不能解决问题。
$('#urlCopyButton').click(function search() {
var searchWord = document.querySelector('#searchWord').value;
console.log(searchWord);
var results = [];
$.ajax({
crossDomain: true,
header: 'Access-Control-Allow-Origin',
url:`https://en.wikipedia.org/w/api.php?action=opensearch&format=json&maxlag=5&search=${searchWord}&callback=?`,
type: 'GET',
dataType: 'json',
beforeSend: function(xhr){xhr.setRequestHeader('https://en.wikipedia.org', 'https://en.wikipedia.org');},
success: (data) => {
$("#output").html("");
var i =0;
for (var i = 0; i < data[1].length; i++) {
$("#output").append(`<li><a href= "${data[3][i] } ">${data[1][i] + " " + data[2][i]}<a></li>`);
}
console.log(data);
},
error: (err) =>{
console.log(err.responseJSON);
}
})
})
我希望它会成功,并且控制台中的数据会增加,但不是这样会引发此错误:
拒绝加载脚本'https://en.wikipedia.org/w/api.php?action=opensearch&format=json&maxlag=5&search=dfa&callback=jQuery33108394586597996985_1549655186216&_=1549655186217',因为它违反了以下内容安全策略指令:“ script-src'self'blob:文件系统:chrome-extension-resource:”。请注意,未明确设置“ script-src-elem”,因此将“ script-src”用作备用。
发送@ jquery.js:2“
答案 0 :(得分:1)
Wikipedia的callback=?
参数是一种古老的黑客手段,可以将dataType: 'json'
作为脚本加载,默认情况下,扩展程序中的CSP禁止使用。尽管许多现有的答案都建议放宽默认扩展名CSP,但这显然是一个糟糕的解决方案,它会使扩展名受到各种远程攻击(如MitM)的攻击。</ p>
只需删除&callback=?
参数,以使Wikipedia默认返回有效的JSON。
无需进行与标头或crossDomain: true
之类的CORS相关的调整,无需修改CSP。
$.ajax({
url: 'https://en.wikipedia.org/w/api.php?' +
'action=opensearch&format=json&maxlag=5&search=' + encodeURIComponent(searchWord),
success(data) {
// ...............
// data is an object/array, you can process it directly here
// ...............
},
});
manifest.json应该允许URL:
"permissions": ["https://*.wikipedia.org/"]
"permissions": ["<all_urls>"]