javascript - 如何修复 Chrome 扩展中的“Chrome 内容安全策略指令”
问题描述
我正在制作一个 chrome 扩展,通过使用 JQuery 的 ajax 调用访问维基百科的 API。我在扩展的本地 js 文件夹中包含了 JQuery 的副本。在弹出窗口中,我有一个输入,我获取该值并在 popup.js 中执行一个 get 请求,我得到一个“拒绝加载脚本,因为它违反了以下内容安全策略指令:”script-src 'self' blob : 文件系统: chrome-extension-resource:"。请注意,'script-src-elem' 没有明确设置,所以 'script-src' 用作后备。"
我已经在文件WebRequest and <all_urls>
中设置了权限。manifest.json
这是我的权限在清单中的样子:
"permissions": [
"tabs",
"webNavigation",
"webRequest",
"<all_urls>",
"https://en.wikipedia.org/*"
],
我看到添加 a"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"
解决方案
Wikipedia 的参数是一个古老的 hack,可以作为脚本callback=?
加载,默认情况下 CSP 在扩展中是禁止的。dataType: 'json'
虽然许多现有答案都建议放宽默认扩展 CSP,但这显然是一个糟糕的解决方案,它将扩展打开到各种远程攻击(如 MitM)。
只需删除&callback=?
参数,以便 wikipedia 默认返回有效的 JSON。
不需要与 CORS 相关的调整,如 headers 或crossDomain: true
,不需要修改 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>"]
推荐阅读
- c - 将字符串转换为十六进制、十进制和八进制
- php - 通过 POST 请求发送的 jQuery AJAX 变量,但我不能在 PHP 中使用它
- eclipse - Eclipse eGit 未连接到远程存储库 - ProxyHelper getPasswordAuthentication 处的 NullPointerException
- android - 如何能够将数据保存在列表中并在 recyclerview 中显示
- python - Python 命令行参数选项 -d
- c# - 如何防止在 C# ASP.NET 中将重复数据插入到 Gridview 中
- java - 如何将大文件(10+ GB)从 HDFS 传输到 Java/Scala 中的 Google 存储?
- vim - 使用 Vim 管理拆分和多个文件
- docker - docker compose YAML file: Re-using variables passed to the entrypoint as arguments
- django - 将文件发送到不同的服务器