看到这样的代码来检查XHR非常普遍:
if (
isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'
) {
// ajax happened
}
为什么strtolower
总是在这里使用,而不仅仅是与XMLHttpRequest
比较?这只是偏执还是有真正的原因?
答案 0 :(得分:2)
HTTP标头。客户端可以是由Javascript或Javascript框架触发的shell脚本,浏览器或Ajax调用。 Ajax中的“j”代表Javascript,但是可以使用任何其他脚本或程序创建HTTP请求。
来自Common non-standard request headers:
X-Requested-With:主要用于识别Ajax请求。大多数JavaScript框架都会使用XMLHttpRequest XMLHttpRequest
的值发送此标头。
所有以X-
开头的标头都是非标准标头,这意味着没有定义其值的官方文档。
来自http://tools.ietf.org/html/rfc6648:
历史上,应用程序协议的设计者和实现者 经常区分标准化和非标准化 参数的前缀是非标准化参数的名称 字符串“X-”或类似的结构。
HTTP协议不是固定的或静态的,只有应该遵循的标准。
您甚至可以创建自己的HTTP请求并将各个标头放入,例如:
X-Requested-With: MySuperCURLScript
X-MyOwnHeader: Cool!
要回答您的问题,如果一个客户端发送标头X-Requested-With: XMLHttpRequest
,另一个客户端发送X-Requested-With: xmlHttpRequest
,您可以简单地将所有内容小写,并确保不要错过不同的表示法。就这么简单!
安全方面:标题及其内容仅是信息,而不是您应该100%依赖的信息。如果您深入了解CURL,或谷歌搜索“使用php发送http标头”,您将很快发现任何信息都可以轻松发送和伪造。 HTTP标头经常被滥用来破解服务器,通过发送被操纵的cookie( - 一个cookie是一个标题,简单如下:Cookie: ...
),操纵文件信息(上传假的gif,这是一个exe文件,依此类推) ,操纵会话数据,POST /请求数据。