Injecting content scripts and requesting cross-origin permissions

12 浏览
0 Comments

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

同源策略被实施以防止恶意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);

0