Injecting content scripts and requesting cross-origin permissions
Injecting content scripts and requesting cross-origin permissions
我想知道以下情况是Chrome中的一个错误、正常工作或是开发者的错误。
所以,我有一个扩展程序。在其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扩展程序页面。它看起来像这样:
该框架的src与我的内容脚本模式匹配。因此,当框架加载时,injectedScript.js被注入其中。但是injectedScript内部的XMLHttpRequest失败了。
现在,这让我想知道预期的行为是什么。当我已经请求了适当的权限时遇到CORS问题是令人沮丧的......但我也可以理解,我正在尝试从我的chrome-extension外部的一个源访问“http://www.bar.com/123”......虽然它是一个我有权限访问的嵌入到扩展中的iframe。
有任何人对此有想法吗?
编辑:如果你想知道我从实践角度在考虑什么——我想注入一些JavaScript,可以在注入页面的视频上调用getImageData。但是,我不能这样做,因为getImageData认为视频的src是脏数据。我已请求了相应的许可,但它不会传递到iframe中。
更新:这是一张图片:http://i.imgur.com/PR48HO2.png
同源策略被实施以防止恶意JavaScript攻击(您可以在这里阅读更多信息),是Web安全模型的重要组成部分。因此,很遗憾,您不能直接在内容脚本中使用HTTP请求。
但是,如果您恰好可以访问要允许访问的文件,则可以添加以下PHP代码以允许跨域:
header('Access-Control-Allow-Origin: *');
该代码基本上允许任何网站/IP地址使用以下文件的跨域。
如果您无法访问该文件,则可以采用解决方法,例如不直接尝试获取HTML,而是调用在个人服务器上启用具有Cross-Origin的PHP脚本来获取HTML,使用上面的代码。
以下是一个例子:
header('Access-Control-Allow-Origin: *'); $URL = ("http://www.bar.com/123"); $HTMLfromURL = file_get_contents($URL); echo $HTMLfromURL
然后,对于Chrome扩展,具体如下:
注意:您正在使用过时的XMLHTTPRequest,会对用户端造成重大的性能影响。下面的代码是同样功能的异步版本,没有负面的性能影响。
var URL = "http://example.com/myscript.php"; var xhr = new XMLHttpRequest(); xhr.open("GET", URL, true); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { var HTMLfromURL = xhr.responseText; } else { // Received unexpected HTML error code (such as 404, or 403) console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.statusText); // Run this code if failed to load page }; xhr.send(null);