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

2,889次阅读

共计 1160 个字符,预计需要花费 3 分钟才能阅读完成。

对于 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一般以模块的方式运行 PHPApache 会进行设置,所以一般不存在这个问题。

正文完
 
Blood.Cold
版权声明:本站原创文章,由 Blood.Cold 2019-05-06发表,共计1160字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。