Google chrome extension 注入内容脚本并请求跨源权限

Google chrome extension 注入内容脚本并请求跨源权限,google-chrome-extension,cross-domain,same-origin-policy,Google Chrome Extension,Cross Domain,Same Origin Policy,我很好奇下面的场景是Chrome中的bug、按预期工作还是开发人员错误 所以,我有一个分机。在manifest.json中,我请求两个站点的跨源权限: "permissions": [ "http://www.foo.com/*", "http://www.bar.com/*" ] 我还声明了一个内容脚本: "content_scripts": [ { "matches": ["http://www.foo.com/*"], "js": ["in

我很好奇下面的场景是Chrome中的bug、按预期工作还是开发人员错误

所以,我有一个分机。在manifest.json中,我请求两个站点的跨源权限:

"permissions": [
    "http://www.foo.com/*",
    "http://www.bar.com/*"
]
我还声明了一个内容脚本:

"content_scripts": [
    {
      "matches": ["http://www.foo.com/*"],
      "js": ["injectedScript.js"]
    }
]
所以,我已经表示我想将“injectedScript.js”注入所有foo.com域。“injectedScript.js”看起来像:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handleStateChange; // Implemented elsewhere.
xhr.open("GET", 'http://www.bar.com/123'), true);
xhr.send();
现在,一个iframe被添加到我的Chrome扩展的页面中。看起来是这样的:

<iframe src="http://www.foo.com/123"></iframe>

此框架的src与我的内容脚本模式匹配。因此,当框架加载时,injectedScript.js将被注入其中但是injectedScript内部的XMLHttpRequest失败。

现在,这让我想知道预期的行为是什么。当我请求适当的权限时,遇到CORS问题是令人沮丧的。。。但我也能理解,我正试图从我的chrome扩展之外的来源访问“”。。。尽管iframe已加载到扩展中,我有权访问该扩展

有人对这件事有什么想法吗

编辑:如果你想知道我从实际的角度能得到什么——我想在注入的页面中注入一些javascript,可以在视频上调用getImageData。但是,我不能,因为getImageData认为视频的src是受污染的数据。我已经请求了适当的权限,但它没有进入iframe


更新:这里有一张图片:

实施同源策略是为了防止恶意JavaScript攻击(您可以了解更多相关信息),它是web安全模型的重要组成部分。很遗憾,您不能在内容脚本中直接使用HTTP请求

但是,如果您碰巧有权访问要允许访问的文件,则可以添加以下PHP代码以允许跨源:

header('Access-Control-Allow-Origin:');
该代码基本上允许任何网站/IP地址在以下文件上使用交叉源

如果您没有访问该文件的权限,您可以做一些变通方法,例如,不要试图直接获取HTML,而是在个人服务器上调用一个PHP脚本,该脚本将使用上面的代码为您获取启用了跨源代码的PHP脚本

以下是一个例子:

header('Access-Control-Allow-Origin:');
$URL=(”http://www.bar.com/123");
$HTMLfromURL=文件获取内容($URL);
echo$HTMLfromURL
然后在铬合金延伸侧有:

注意:您正在使用的XMLHTTPRequest已经过时,并且会导致 对用户端的重大性能影响。下面的代码是一个 异步版本同样对性能没有负面影响

var URL=”http://example.com/myscript.php";
var xhr=new XMLHttpRequest();
xhr.open(“GET”,URL,true);
xhr.onload=函数(e){
if(xhr.readyState==4){
如果(xhr.status==200){
var HTMLfromURL=xhr.responseText;
}否则{
//收到意外的HTML错误代码(如404或403)
控制台错误(xhr.statusText);
}
}
};
xhr.onerror=函数(e){
控制台错误(xhr.statusText);
//如果加载页面失败,请运行此代码
};
xhr.send(空);

我也面临同样的问题。我知道你已经找出了原因,并在(不幸的)扩展中解决了它。您能分享解决方案吗(也许您自己添加一个答案)?您所使用的XMLHTTPRequest已经过时,并且会对用户端的性能造成重大影响。?