4

我希望我的带有 REST API 的应用程序可以以不同的方式访问:

  • 来自同一个域(在这里使用普通的 AJAX 请求)
  • 通过站点所有者 (CORS) 附加的脚本从另一个域
  • 通过用户脚本从另一个域(GM_xmlhttpRequest(?))

我想限制我的应用程序的站点列表可以通过白名单访问。

我知道如何使用 CORS,但我不确定它是否以GM_xmlhttpRequest相同的方式工作,因为GM_xmlhttpRequest不需要Origin从服务器发回标头。

我不关心客户端,但我仍然需要检查从哪个站点发送请求的服务器,并回答{response:"site not supported"}它是否不在白名单中。

那么,当我在某个网页上运行用户脚本并制作GM_xmlhttpRequest时,服务器可以检测到来源吗?

4

1 回答 1

3

您不能使用Origin标头可靠地限制用户脚本对您的 API 的访问。

默认情况下,GM_xmlhttpRequest()Doc根本不发送Origin标头。也不会GM_xmlhttpRequest阻止跨站点请求;这是存在的主要原因GM_xmlhttpRequest

此外,对于Greasemonkey (Firefox) 和Tampermonkey (Chrome),默认情况下GM_xmlhttpRequest不发送标头。referer

但是,可以将两个 标题都覆盖为脚本编写者想要的任何内容。

这是一个欺骗两个标头的演示脚本(使用数据包嗅探器自己查看):

// ==UserScript==
// @name        _Test Fake Referrer
// @include     http://stackoverflow.com/questions/18178934/*
// @grant       GM_xmlhttpRequest
// ==/UserScript==

GM_xmlhttpRequest ( {
    method:     "GET",
    url:        "http://www.google.com",
    headers:    {
        referer:  "http://microsoft.com",
        origin:   "http://microsoft.com"
    }
} );



一个普通的 Chrome 用户脚本对脚本开发者来说不是那么友好。原生 Chrome 用户脚本从不发送Origin标头,总是将当前页面作为referer.

如果您尝试欺骗这些标头中的任何一个,控制台将显示如下错误:

拒绝设置不安全的标头“referer”
拒绝设置不安全的标头“origin”

这是为您的 Chrome 用户脚本使用 Tampermonkey 的另一个原因。

于 2013-08-12T04:49:04.010 回答