为什么使用strtolower来验证$ _SERVER ['HTTP_X_REQUESTED_WITH']?

时间:2013-09-12 15:29:36

标签: php ajax xmlhttprequest

看到这样的代码来检查XHR非常普遍:

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

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

1 个答案:

答案 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 /请求数据。