Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么要使用strtolower验证$服务器[';HTTP#u X#u请求的';]?_Php_Ajax_Xmlhttprequest - Fatal编程技术网

Php 为什么要使用strtolower验证$服务器[';HTTP#u X#u请求的';]?

Php 为什么要使用strtolower验证$服务器[';HTTP#u X#u请求的';]?,php,ajax,xmlhttprequest,Php,Ajax,Xmlhttprequest,在检查XHR时,看到这样的代码是非常常见的: if ( isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) { // ajax happened } 为什么这里总是使用strtolower,而不只是比较XMLHttpRequest?这仅仅是妄想还是有真正的原因?请求中的

在检查XHR时,看到这样的代码是非常常见的:

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

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

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

发件人:

X-request-With:主要用于识别Ajax请求。大多数JavaScript框架发送此标头时,其值为XMLHttpRequest
XMLHttpRequest

所有以
X-
开头的标题都是非标准标题,这意味着没有定义其值的正式文档

发件人:

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

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

您甚至可以创建自己的HTTP请求,并将各个标头放入其中,例如:

X-Requested-With: MySuperCURLScript
X-MyOwnHeader: Cool!
为了回答您的问题,如果一个客户端发送标题
X-request-With:XMLHttpRequest
,另一个客户端发送
X-request-With:XMLHttpRequest
,您只需将它们全部小写,并确保不会遗漏不同的符号。就这么简单


安全方面:标题及其内容只是信息,而不是你应该100%依赖的东西。如果您深入研究了CURL或googleresults中的“sendttpheaderwithphp”,您会很快发现任何信息都很容易被发送和伪造。HTTP头经常被滥用来攻击服务器,通过发送被操纵的cookie(-cookie是一个头,很简单:
cookie:…
),被操纵的文件信息(上传一个假的gif,它是一个exe文件等等),操纵会话数据,发布/请求数据。

一些框架等可以在没有“正确”的情况下发送该字符串字符大小。如果您确信您的代码发送的是“XMLHttpRequest”,而不是“XMLHttpRequest”,那么您可以简化这一行。@WesleyMurch-您正在编写一个通过CORS跨域访问的服务吗?或者你的前端开发人员不是你团队的一员吗?@Quentin为了讨论起见,是的。要问的问题是:你是否100%确信世界上所有现有浏览器发送的案例都是正确的,并且所有现有的web/代理/缓存服务器都不修改案例。如果没有,那么最好这样做。由于到目前为止的评论,我现在认为我对
HTTP\u X\u request\u和
有一个基本的误解。该值来自何处,在什么时候可以修改?