1

像这样检查 XHR 的代码非常常见:

if (
     isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&      
     strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'
) {
    // ajax happened
}

为什么strtolower总是在这里使用而不是仅仅比较XMLHttpRequest?这只是偏执狂还是有真正的原因?

4

1 回答 1

2

请求中的HTTP 标头始终由客户端包含。客户端可以是 shell 脚本、浏览器或由 Javascript 或 Javascript 框架触发的 Ajax 调用。Ajax 中的“j”代表 Javascript,但是可以使用任何其他脚本或程序创建 HTTP 请求。

来自常见的非标准请求标头

X-Requested-With:主要用于识别Ajax请求。大多数 JavaScript 框架都会发送带有 XMLHttpRequest 值的标头XMLHttpRequest

所有以标头开头X-的标头都是非标准标头,这意味着没有官方文档定义它们的值。

来自https://www.rfc-editor.org/rfc/rfc6648

历史上,应用协议的设计者和实现者经常 通过在非标准化参数的名称前加上 字符串“X-”或类似结构
来区分标准化和非标准化参数。

HTTP 协议不是固定的或静态的,只有您应该遵循的标准。

您甚至可以创建自己的 HTTP 请求并放入单独的标头,例如:

X-Requested-With: MySuperCURLScript
X-MyOwnHeader: Cool!

要回答您的问题,如果一个客户端发送 header X-Requested-With: XMLHttpRequest,另一个发送X-Requested-With: xmlHttpRequest,您可以简单地将它们全部小写,并确保不要错过不同的符号。就那么简单!

安全方面:标头及其内容只是信息,而不是您应该 100% 依赖的东西。如果您深入了解 CURL 或“使用 php 发送 http 标头”的 Google 结果,您会很快发现任何信息都可以轻松发送和伪造。HTTP 标头经常被滥用来入侵服务器,通过发送操纵的 cookie(- cookie 是标头,就这么简单:)Cookie: ...,操纵文件信息(上传一个 exe 文件的假 gif 等),操纵会话数据, POST / 请求数据。

于 2013-09-12T15:52:23.343 回答