在 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 标头添加到所有跨域GETs。因此,如果 GET 请求是从浏览器发出的同源请求,则不会有 Origin

浏览器发送Origin 用于同源POSTs,而不仅仅是跨源POSTs。

浏览器也会为 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 中检测获取请求的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中检测 Ajax 并确保请求来自我自己的网站

在 PHP 中检测 HTTPS 请求

如何通过php的curl模拟ajax请求,获取其返回值

php [PHP]检测AJAX请求

如何在php中获取curl请求的请求头信息及相应头信息

PHP 检测Ajax请求