在 PHP 中检测到提取请求
Detect a fetch request in PHP
如何检测来自 PHP 中 Fetch API 的请求?
我目前正在使用以下方法检测 AJAX 请求:
$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
理想情况下,我可以用类似的方式检测 Fetch 请求。有没有人有什么技术可以做到这一点?
没有可靠的方法来区分使用 Fetch API 发出的请求与使用 XHR 或某些 AJAX 库发出的请求。 Fetch API 不会导致发送任何唯一的 header。
如果您只想检测请求是否可能来自浏览器中的前端代码 运行,您可以通过检查 Origin
header。浏览器将 Origin
header 添加到所有 cross-origin GET
中。因此,如果 GET
请求是从浏览器 same-origin 发出的,它不会有 Origin
.
并且浏览器在 same-origin POST
秒内发送 Origin
,而不仅仅是 cross-origin POST
秒。
并且浏览器也会发送 Origin
XHR 请求,而不仅仅是来自 Fetch API.
的请求
所以没有可靠的方法来检测服务器端是否使用 Fetch API。
顺便说一句,如果您正在检查 X-Requested-With
请求 header,那只会告诉您,该请求可能是由一个普通的第 3 方 AJAX 发出的library 而不是直接使用 XHR 或 Fetch API。那是因为 X-Requested-With
不是标准(这就是为什么它的名称以 X-
开头的原因)并且从不由浏览器本身发送,而是由主要图书馆发送。
所以我想如果您没有看到X-Requested-With
请求header,至少您知道该请求可能不是来自代码在任何主要库中使用任何 AJAX 方法,尽管这仅意味着它也可以从 curl
或其他东西而不是浏览器发送。
并且如果您看到 Origin
请求 header 但没有看到 X-Requested-With
请求,那么至少您知道该请求可能是从浏览器发送的,而不是使用主要库——尽管有一些可能性它仍然可以与 curl
或其他任何东西一起发送,如果有人手动向请求添加 Origin
header。
添加到抓取选项
headers:{'X-Requested-With':'XMLHttpRequest'}
添加这个:
fetch(url, {
headers: {
'credentials': 'same-origin',
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json'
// or 'Content-Type': 'application/x-www-form-urlencoded'
},
method: 'POST'
})
如何检测来自 PHP 中 Fetch API 的请求? 我目前正在使用以下方法检测 AJAX 请求:
$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
理想情况下,我可以用类似的方式检测 Fetch 请求。有没有人有什么技术可以做到这一点?
没有可靠的方法来区分使用 Fetch API 发出的请求与使用 XHR 或某些 AJAX 库发出的请求。 Fetch API 不会导致发送任何唯一的 header。
如果您只想检测请求是否可能来自浏览器中的前端代码 运行,您可以通过检查 Origin
header。浏览器将 Origin
header 添加到所有 cross-origin GET
中。因此,如果 GET
请求是从浏览器 same-origin 发出的,它不会有 Origin
.
并且浏览器在 same-origin POST
秒内发送 Origin
,而不仅仅是 cross-origin POST
秒。
并且浏览器也会发送 Origin
XHR 请求,而不仅仅是来自 Fetch API.
所以没有可靠的方法来检测服务器端是否使用 Fetch API。
顺便说一句,如果您正在检查 X-Requested-With
请求 header,那只会告诉您,该请求可能是由一个普通的第 3 方 AJAX 发出的library 而不是直接使用 XHR 或 Fetch API。那是因为 X-Requested-With
不是标准(这就是为什么它的名称以 X-
开头的原因)并且从不由浏览器本身发送,而是由主要图书馆发送。
所以我想如果您没有看到X-Requested-With
请求header,至少您知道该请求可能不是来自代码在任何主要库中使用任何 AJAX 方法,尽管这仅意味着它也可以从 curl
或其他东西而不是浏览器发送。
并且如果您看到 Origin
请求 header 但没有看到 X-Requested-With
请求,那么至少您知道该请求可能是从浏览器发送的,而不是使用主要库——尽管有一些可能性它仍然可以与 curl
或其他任何东西一起发送,如果有人手动向请求添加 Origin
header。
添加到抓取选项 headers:{'X-Requested-With':'XMLHttpRequest'}
添加这个:
fetch(url, {
headers: {
'credentials': 'same-origin',
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json'
// or 'Content-Type': 'application/x-www-form-urlencoded'
},
method: 'POST'
})