检测 PHP 中的 fetch 请求

Mik*_*agz 3 php fetch-api

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

$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
Run Code Online (Sandbox Code Playgroud)

理想情况下,我可以以类似的方式检测 Fetch 请求。有没有人有任何技术来实现这一点?

zar*_*doz 10

添加获取选项标头:{'X-Requested-With': 'XMLHttpRequest'}


sid*_*ker 5

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

如果您只想检测请求是否可能来自在浏览器中运行的前端代码,您可以通过检查Origin标头。浏览器将Origin标头添加到所有跨域GET请求。因此,如果GET请求是来自浏览器的同源请求,则不会有Origin.

浏览器发送Origin同源POST请求,而不仅仅是跨域POST请求。

浏览器Origin也会发送使用 XHR发出的请求,而不仅仅是来自 Fetch API 的请求。

因此,如果请求是使用 Fetch API 发出的,则没有可靠的方法来检测服务器端。

顺便说一句,如果您正在检查X-Requested-With请求标头,那么只会告诉您,该请求可能是使用通用的第三方 AJAX而不是直接使用 XHR 或 Fetch API发出的。那是因为X-Requested-With它不是标准(这就是它的名称以 开头的原因X-)并且从来没有由浏览器本身发送,而是由主要库发送。

所以我想如果你没有看到X-Requested-With请求头,那么至少你知道请求可能不是由使用任何主要库中的任何 AJAX 方法的代码发送的,尽管这只是意味着它也可能是发送自curl或某物而不是浏览器。

如果您看到Origin请求标头但没有看到X-Requested-With请求,那么至少您知道该请求可能是从浏览器发送的,但没有使用主要库——尽管curl如果有人手动添加了一个Origin请求头。