在 PHP 中检测获取请求
Posted
技术标签:
【中文标题】在 PHP 中检测获取请求【英文标题】:Detect a fetch request in PHP 【发布时间】:2017-10-27 09:47:12 【问题描述】:如何在 php 中检测来自Fetch API 的请求? 我目前正在使用以下方法来检测 AJAX 请求:
$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
理想情况下,我可以以类似的方式检测 Fetch 请求。有没有人有任何技术可以做到这一点?
【问题讨论】:
【参考方案1】:没有可靠的方法来区分使用 Fetch API 发出的请求与使用 XHR 或某些 AJAX 库发出的请求。 Fetch API 不会导致发送任何唯一的标头。
如果您只想检测请求是否可能来自在浏览器中运行的前端代码,您可以通过检查 Origin
标头。浏览器将Origin
标头添加到所有跨域GET
s。因此,如果 GET
请求是从浏览器发出的同源请求,则不会有 Origin
。
浏览器发送Origin
用于同源POST
s,而不仅仅是跨源POST
s。
浏览器也会为 XHR 请求发送 Origin
,而不仅仅是来自 Fetch API 的请求。
因此,如果请求是使用 Fetch API 发出的,则没有可靠的方法在服务器端进行检测。
顺便说一句,如果您正在检查 X-Requested-With
请求标头,那么您只能知道,该请求可能是使用常见的第 3 方 AJAX 库发出的,而不是直接使用XHR 或 Fetch API。这是因为X-Requested-With
不是标准(这就是它的名称以 X-
开头的原因),并且从来不会由浏览器本身发送,而是由主要库发送。
所以我猜如果您没有看到X-Requested-With
请求标头,至少您知道该请求可能不是来自使用任何主要AJAX 方法的代码库,但这只是意味着它也可以从 curl
或其他东西而不是浏览器发送。
如果您看到Origin
请求标头但没有看到X-Requested-With
请求,那么至少您知道该请求可能是从浏览器发送的,但没有使用主要库——尽管它仍有可能被发送使用curl
或其他,如果有人在请求中手动添加了Origin
标头。
【讨论】:
非常感谢您的详细回答。澄清一下,我不需要区分通过 XHR 和 Fetch 发出的请求 - 我需要来自同源的任何 GET 请求的通用布尔值,无论它们是 XHR 还是 Fetch。话虽如此,根据您的回答,我似乎可以检查Origin
标头。 Origin
标头的缺失是否会确认它确实是来自同源的 GET 请求?
是的,就GET
在浏览器中运行的javascript发起的请求而言,没有Origin
请求标头将表明该请求是同源的。 (但是,如果有人在请求中明确设置了mode: no-cors
,它也会缺少Origin
;但是设置mode: no-cors
几乎总是一个错误,并且使用该模式创建的请求几乎永远不会像作者那样工作故意的,所以我认为这是一个可以被视为编程错误的优势。)【参考方案2】:
添加到获取选项 标头:'X-Requested-With': 'XMLHttpRequest'
【讨论】:
如果您可以控制 fetch 语句所在的代码,这是一个非常明智的解决方法/垫片。以上是关于在 PHP 中检测获取请求的主要内容,如果未能解决你的问题,请参考以下文章