Php 为什么要使用strtolower验证$服务器[';HTTP#u X#u请求的';]?
在检查XHR时,看到这样的代码是非常常见的: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?这仅仅是妄想还是有真正的原因?请求中的
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框架发送此标头时,其值为XMLHttpRequestXMLHttpRequest
所有以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和有一个基本的误解。该值来自何处,在什么时候可以修改?