首页 > 解决方案 > 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 中(或者如果它是, 请解释!)。如果您建议其他答案或投票结束,请实际检查其他答案是否回答了这个问题。

标签: google-chrome-extension

解决方案


您需要从 CSP 字符串中删除尾随星号。星号不会被解释为 CSP 字符串中源标识符的路径部分中的通配符。您当前的 CSP 字符串只允许连接到文字 URL https://my.website.com/*

内容安全策略 2 级规范明确指出:

匹配包含路径的源表达式的规则比看起来更简单:以“/”字符结尾的路径匹配目录及其子目录中的所有文件。不以“/”字符结尾的路径仅匹配一个特定文件。

除此之外,清单中的 CSP 字符串应限制script-srcand object-src(显式或使用default-src)。如果不这样做,Chrome 会在扩展​​详细信息页面上显示警告。

因此,清单中的 CSP 行应如下所示:

"content_security_policy":"default-src 'self'; connect-src 'self' https://my.website.com/",

推荐阅读