注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老和山小和尚

敬天爱人

 
 
 

日志

 
 
 
 

CGI uri和HTTP uri的区别,以及Nginx惊天“漏洞”的修正  

2010-05-21 18:28:53|  分类: Nginx |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
区别

根据RFC 3875(CGI协议的最新标准) CGI uri的外形简单的来说是这样的:
cgi_uri = SCRPIT_NAME PATH_INFO

SCRIPT_NAME = "" | ( "/" path ) 

PATH_INFO = "" | ( "/" path )
path      = lsegment *( "/" lsegment )
lsegment  = *lchar
lchar     = any TEXT or CTL except "/"


而一般来说HTTP_URI是这样的:

http_uri = /path/to/script

可以说两者是正好相反的。

漏洞模拟及修正

一般来说,在php的fix_pathinfo默认开启情况下,如果cgi请求没有带PATH_INFO参数的话,php-cgi就会去尝试解析uri, 提取出PATH_INFO出来。

以/80sec.jpg/80sec.php为例, 在没有prefix目录的情况下,SCRIPT_NAME就是第一个‘/’和第二个‘/’之间的内容:/80sec.jpg,PATH_INFO就是余下 内容:/80sec.php。这时php-cgi如果找到SCRIPT_NAME就会去执行(我觉得这里为什么不看看后缀名再执行,很奇怪)。

而默认情况下,nginx是把http_uri直接传给后端cgi的,不带PATH_INFO参数。但是你可以通过 fastcgi_split_path_info(http: //wiki.nginx.org/NginxHttpFcgiModule#fastcgi_split_path_info)来改正,由nginx来 提取请求的uri。这样php-cgi就不会自作聪明的去解析uri了。

结论

我觉得fix_pathinfo这个配置其实用处不大,php也是为了配合CGI标准而设为默认,据说它唯一的作用是在rewrite路径的时候有用,如 果你不想用的话,大可以关闭之。至于这个漏洞,应该是Nginx没有配置好的漏洞,但是危害不小。

  评论这张
 
阅读(1520)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017