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

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

最后修改:2019 年 04 月 27 日 10 : 24 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论

8 条评论

  1. Qicloud

    感谢大佬提供的教程,已经用上了,特别感谢,希望能转载下,给更多人看到。今天被挂马两次,害怕了也希望能帮到更多人

    1. 康康
      @Qicloud

      可以的,欢迎转载

  2. Qicloud

    配置完文章报错404什么鬼

    1. 康康
      @Qicloud

      注意看下我的全文,是可以的

    2. Qicloud
      @Qicloud

      用的bt免费版最新版nginx1.14.2+php56
      cgi.fix_pathinfo = 1已经修改
      nginx改后博客首页正常显示,但是点开文章报错404

      1. 康康
        @Qicloud

        注意检查配置

  3. 小客

    谢谢,解决了

    1. 康康
      @小客

      不客气