来自 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版本浏览器的跨域问题解决方案