关于Nginx下使用Typecho时,cgi.fix_pat
昨天被连续挂马两次
从爱喝茶的康康博客拿到修复教程
特此转载
对于Typecho
来说,路径的获取是使用pathinfo
来获取的,咱们不需要了解原理,只要知道pathinfo
是将传入的路径进行分组解析即可。
而在Typecho
的官方文档中,是存在这样的说明的:
Apache服务器上的No input file specified
错误
在根目录下找到php5.ini文件(如果找不到就建立
一个),在里面加上如下内容
cgi.fix_pathinfo = 1
在某些老版本的php里面,可能还要打开php.ini里
的cgi.fix_pathinfo
cgi.fix_pathinfo = 1
这是为什么呢?因为在PHP中,Web软件执行PHP程序,是存在CGI模式的,比如Nginx就属于CGI执行模式。
而在CGI模式执行时,若不打开cgi.fix_pathinfo的话,$_SERVER['PATH_INFO']这一全局变量就不会生效,这样就无法获取正确的路径信息。
按照Typecho官方文档的说法其实也算是正确,开启后的确可以解决路径无法获取的问题,但却存在着巨大的安全隐患!
引用laruence大神在2010年的一篇博文:http://www.laruence.com/2010/05/20/1495.html
其中有特别说明了,在开启cgi.fix_pathinfo后,通过正则传入Nginx的路径:
比如http://xxx.com/fake.jpg/foo.php PHP会认为SCRIPT_FILENAME是fake.jpg, 而 foo.php是PATH_INFO, 然后PHP就把fake.jpg 当作一个PHP文件来解释执行… 这样的话,如果网站开启了用户上传图片,而用户上传的图片实际上是经过伪装的PHP文件呢?很显然,那就可以为所欲为咯!
听说在高版本的PHP中已经修复了这个问题,但康康不太清楚,咱们既然发现了这个问题,就得解决,而且按照隐患没有被修复的情况来进行解决!
首先第一点,在php.ini中找到cgi.fix_pathinfo = 1这一条配置,将其修改为cgi_fix_pathinfo = 0。
接着,在Nginx的配置文件中,找到关于PHP的执行配置,比如: location ~ [^/].php(/|$) { fastcgi_pass unix:/data/run/php- cgi.sock; fastcgi_index index.php; include fastcgi.conf; } 在fastcgi_pass上面加上一行: fastcgi_split_path_info ^(.+?.php)(/.*)$; 这样的结果就是,由Nginx来设置PATH_INFO的值,而不交给PHP进行设置,这样就避免了安全隐患。
对于使用Apache的朋友来说,Apache一般以模块的方式运行PHP,Apache会进行设置,所以一般不存在这个问题。