google-chrome-extension - Chrome 扩展,XMLHttpRequest 内容安全策略错误
问题描述
我有一个 Chrome 扩展程序,它从扩展程序的后台脚本向我的网站发出 POST 请求。我收到以下错误(显示在 Chrome 的扩展管理器中):
拒绝连接到“ https://my.website.com/path/ ”,因为它违反了以下内容安全策略指令:“default-src 'none'”。请注意,'connect-src' 没有明确设置,因此 'default-src' 用作后备。
老实说,我什至不清楚是否需要更改 js 代码或服务器端中的某些内容。
背景.js:
var xmlHttp;
function makerequest(){
xmlHttp=new XMLHttpRequest();
xmlHttp.open("POST", "https://my.website.com/path/",true);
xmlHttp.onreadystatechange = got_response;
var formData = new FormData();
xmlHttp.send(formData);
}
function got_response(){
if (xmlHttp.readyState == 4){
alert(xmlHttp.responseText);
}
}
清单包括:
"permissions": ["activeTab", "*://my.website.com/*","contextMenus"],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_security_policy":"connect-src 'self' https://my.website.com/*",
我已经看到还有其他相关的问题/答案。但是,他们要么试图访问其他人的网站(不是我控制的网站),要么使用内联代码存在问题,这似乎不是问题,因为代码在 background.js 中(或者如果它是, 请解释!)。如果您建议其他答案或投票结束,请实际检查其他答案是否回答了这个问题。
解决方案
您需要从 CSP 字符串中删除尾随星号。星号不会被解释为 CSP 字符串中源标识符的路径部分中的通配符。您当前的 CSP 字符串只允许连接到文字 URL https://my.website.com/*
。
内容安全策略 2 级规范明确指出:
匹配包含路径的源表达式的规则比看起来更简单:以“/”字符结尾的路径匹配目录及其子目录中的所有文件。不以“/”字符结尾的路径仅匹配一个特定文件。
除此之外,清单中的 CSP 字符串应限制script-src
and object-src
(显式或使用default-src
)。如果不这样做,Chrome 会在扩展详细信息页面上显示警告。
因此,清单中的 CSP 行应如下所示:
"content_security_policy":"default-src 'self'; connect-src 'self' https://my.website.com/",
推荐阅读
- java - 防止 Tomcat 覆盖控制器建议返回的错误响应
- angular - Angular handleError:如何获取自定义 API 错误消息?
- c# - 我需要知道什么?在这个 if 语句中是什么意思?ASP.NET 核心 2
- java - 第二个活动中的输出不起作用
- javascript - 循环ajax连接超时如何修复
- javascript - 如何在关闭时从弹出窗口中获取参数
- regex - 正则表达式以匹配字母数字后跟下划线和后面的字母数字
- node.js - 如何为节点 HTTP 服务器设置窗口上下文
- mysql - 带有 MIN/MAX 的查询作为子查询比单独查询要慢得多
- c - 将节点附加到指针数组