Javascript GM_xmlhttpRequest发送的HTTP源代码是什么?
我希望我的带有REST API的应用程序能够以不同的风格访问: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头 我不关心客户端,但我仍然需要检查发送请求的服务器,如果它不在白名
- 来自同一域(此处使用普通AJAX请求)
- 通过站点所有者(CORS)附加的脚本从另一个域
- 通过用户脚本(GM_xmlhttpRequest(?)
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"
}
} );