关于Nginx下使用Typecho时,cgi.fix_pathinfo引发的安全问题

  • 关于Nginx下使用Typecho时,cgi.fix_pathinfo引发的安全问题已关闭评论
  • 73 views
  • A+
所属分类:PHP 编码 网站

对于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的执行配置,比如:

fastcgi_pass上面加上一行:

这样的结果就是,由Nginx来设置PATH_INFO的值,而不交给PHP进行设置,这样就避免了安全隐患。

对于使用Apache的朋友来说,Apache一般以模块的方式运行PHPApache会进行设置,所以一般不存在这个问题。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin