来自 Google Chrome 中的用户脚本的跨域 XHR

Posted

技术标签:

【中文标题】来自 Google Chrome 中的用户脚本的跨域 XHR【英文标题】:Cross-origin XHR from a user script in Google Chrome 【发布时间】:2010-12-28 13:01:07 【问题描述】:

有没有人幸运地从 Google Chrome 中的用户脚本执行跨源 XHR?请求通过服务器(我可以在日志中看到它们),但是永远不会触发 readystatechanged 事件。

扩展权限似乎不起作用。 JSONP 也不是。

【问题讨论】:

根据code.google.com/chrome/extensions/xhr.html,如果将用户脚本包装在扩展中,扩展清单可以允许用户脚本进行XSS XHR。 感谢您的回复,我确实读过这方面的信息。这种方法的问题是我不能在 userscripts.org 上托管它并期望它像其他脚本一样立即工作。 【参考方案1】:

Chrome 的当前版本(13.0.781 或更高版本)现在支持大部分或全部 GM_xmlhttpRequest()Doc 功能 -- 包括跨域请求。 见Issue 18857: Support cross-site XMLHttpRequest in content scripts。

所以这个脚本现在在 Chrome(当然还有 Firefox)上运行得非常好:

// ==UserScript==
// @name            _Cross domain (XSS) GM_xmlhttpRequest, Chrome too
// @include         http://***.com/*
// @grant           GM_xmlhttpRequest
// ==/UserScript==

GM_xmlhttpRequest ( 
    method:     "GET",
    url:        "http://www.google.com/",
    onload:     function (response) 
                    console.log (   response.status,
                                    response.responseText.substring (0, 80)
                                );
                
 );

(安装该脚本,然后浏览任何 SO 页面。该脚本会将 Google 主页的前 80 个字符写入控制台。)

【讨论】:

谢谢。我已经很久没有看过我的用户脚本了,这绝对让我有理由确保它与 Chrome 兼容。 请注意,这只适用于@require(就像上面一样),not for @match。后者会抛出XMLHttpRequest cannot load [...] Origin chrome-extension://[...] is not allowed by Access-Control-Allow-Origin.【参考方案2】:

从 Chrome 13 开始,如果您在清单中包含对网站的权限,则可以在内容脚本中执行跨源请求。

Chrome 中的用户脚本是内容脚本。内容脚本不能制作跨域 XHR。如果你想做跨域 XHR,应该在扩展页面(背景、弹出窗口、选项)中完成。

更多信息: http://code.google.com/chrome/extensions/content_scripts.html http://code.google.com/chrome/extensions/xhr.html

【讨论】:

从 Chrome 13.0.781 开始,此答案现已过时。

以上是关于来自 Google Chrome 中的用户脚本的跨域 XHR的主要内容,如果未能解决你的问题,请参考以下文章

Google Chrome73~81版本浏览器的跨域问题解决方案

Google Chrome73~81版本浏览器的跨域问题解决方案

Google Play 警告:您的应用包含跨应用脚本漏洞

验证来自 Javascript 的跨域请求

防止来自静态站点的跨站点脚本攻击

用 Nokitjs 解决前端开发中的跨域问题