Javascript GM_xmlhttpRequest发送的HTTP源代码是什么?

Javascript GM_xmlhttpRequest发送的HTTP源代码是什么?,javascript,greasemonkey,cors,userscripts,gm-xmlhttprequest,Javascript,Greasemonkey,Cors,Userscripts,Gm Xmlhttprequest,我希望我的带有REST API的应用程序能够以不同的风格访问: 来自同一域(此处使用普通AJAX请求) 通过站点所有者(CORS)附加的脚本从另一个域 通过用户脚本(GM_xmlhttpRequest(?) 我想限制我的应用程序可以通过白名单访问的站点列表 我知道如何使用CORS,但我不确定它是否能以同样的方式使用GM\u xmlhttpRequest,因为GM\u xmlhttpRequest不需要从服务器发回Origin头 我不关心客户端,但我仍然需要检查发送请求的服务器,如果它不在白名

我希望我的带有REST API的应用程序能够以不同的风格访问:

  • 来自同一域(此处使用普通AJAX请求)
  • 通过站点所有者(CORS)附加的脚本从另一个域
  • 通过用户脚本(GM_xmlhttpRequest(?)
我想限制我的应用程序可以通过白名单访问的站点列表

我知道如何使用CORS,但我不确定它是否能以同样的方式使用
GM\u xmlhttpRequest
,因为
GM\u xmlhttpRequest
不需要从服务器发回
Origin

我不关心客户端,但我仍然需要检查发送请求的服务器,如果它不在白名单中,则使用类似
{response:“site not supported”}
的回答


因此,当我在某个网页上运行userscript并进行
GM\u xmlhttpRequest
时,服务器能否检测到源代码?

您不能使用
源代码
头来可靠地限制userscripts对API的访问

默认情况下,根本不发送
原点
标题。
GM_xmlhttpRequest
也不会阻止跨站点请求;这是
GM\u xmlhttpRequest
存在的主要原因

另外,对于Greasemonkey(Firefox)和Tampermonkey(Chrome)
GM\u xmlhttpRequest
默认情况下不发送
referer
标题

但是,这两个标题都可以被重写为脚本编写器想要的内容

下面是一个模拟两个头的演示脚本(使用数据包嗅探器自己查看):



普通的Chrome用户脚本对脚本开发人员不太好。原生Chrome用户脚本从不发送
Origin
标题,而是始终将当前页面作为
referer
发送

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

拒绝设置不安全的标题“referer”
拒绝设置不安全的标题“源”

这是在Chrome用户脚本中使用Tampermonkey的另一个原因

// ==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"
    }
} );