2017-05-26 75 views
1

如何在PHP中检测来自Fetch API的请求? 我目前使用下面的方法来检测AJAX请求:在PHP中检测提取请求

$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 

理想我可以检测取以类似的方式请求。有没有人有任何技术来完成这个?

回答

2

没有可靠的方法来区分使用Fetch API与使用XHR或某个AJAX库创建的请求。提取API不会导致发送任何唯一标头。

如果你只是想检测一个请求是从前端代码在浏览器中运行的可能,您就可以通过检查Origin头。浏览器将Origin标题添加到所有跨源GET请求。因此,如果GET请求与浏览器的源相同,它将不具有Origin

而浏览器发送ORIGIN为同源POST请求,而不仅仅是交叉源POST请求。

而且浏览器也发送ORIGIN来处理使用XHR进行的请求,而不仅仅是来自提取API的请求。

所以没有可靠的方法来检测服务器端是否使用Fetch API进行请求。

顺便说一句,如果你检查的X-Requested-With请求头,所有这一切要告诉你的是,该请求可能与一个常见的第三方AJAX ,而不是直接与XHR或提取API制作。这是因为X-Requested-With不是标准(这就是为什么它的名字以X-开头),并且绝不会由浏览器本身发送,而是由主要的图书馆发送。

所以我想如果你看到X-Requested-With请求头,那么至少你知道该请求可能没有被使用任何在任何主要图书馆的AJAX方法的代码发送,尽管这只是意味着它也可能来自curl或其他东西,而不是浏览器。

如果你看到Origin请求头,但不是X-Requested-With请求,那么至少你知道该请求可能是从一个浏览器发送的,但不是使用大图书馆虽然有一些可能性,但仍可能已与curl发送或不管怎样,有人手动为请求添加了Origin标头。

+0

非常感谢您的详细解答。为了澄清,我不需要区分通过XHR和Fetch创建的请求 - 我需要来自同一来源的任何GET请求的通用布尔值,无论它们是XHR还是Fetch。有了这个说法,基于你的回答,似乎我可以检查“Origin”标题。 “Origin”标头的缺失是否确认它确实是来自同一来源的GET请求? –

+0

对于在浏览器中运行的JavaScript启动的'GET'请求,没有'Origin'请求标头就表明请求是同源的。 (但是,如果有人在请求中显式设置'mode:no-cors',它也会缺少Origin;但是设置'mode:no-cors'几乎总是一个错误,并且使用该模式创建的请求几乎是永远不会按照作者的意图工作,所以我认为这是一个可以被认为是编程错误的优势。) – sideshowbarker