让Nginx支持php Pathinfo


这个问题涉及到一个安全漏洞,关键词是 cgi.fix_pathinfo文件类型解析漏洞,具体问题不在缀述。

以前的做法是这样的,把 php 配置文件 php.ini 里的 cgi.fix_pathinfo 值改为0
然后在 nginx 配置 fastcgi_param 里增加一行 try_files $fastcgi_script_name = 404;

下面介绍另一种方法:

最近升级 vps,再次配置时查看文档发现还有一种办法更方便只在 nginx 增加配置 fastcgi_split_path_info 就可以了。

location ~ ^(.+\.php)(.*)$ {
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO          $fastcgi_path_info;
}

fastcgi_param 还要增加一行 try_files $fastcgi_script_name = 404;

这里贴下 nginx 官方文档

Defines a regular expression that captures a value for the $fastcgi_path_info variable. The regular expression should have two captures: the first becomes a value of the $fastcgi_script_name variable, the second becomes a value of the $fastcgi_path_info variable. For example, with these settings

location ~ ^(.+\.php)(.*)$ {

fastcgi_split_path_info       ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;
fastcgi_param PATH_INFO       $fastcgi_path_info;

and the “/show.php/article/0001” request, the SCRIPT_FILENAME parameter will be equal to “/path/to/php/show.php”, and the PATH_INFO parameter will be equal to “/article/0001”.

延伸阅读

nginx文件类型错误解析漏洞
Nginx + PHP CGI的一个可能的安全漏洞
nginx关于fastcgi_split_path_info配置的相关文档

已有 8 位潜水的同学浮出水面了 »

  1. 羽飞
    羽飞 2015-05-30 17:16 回复

    升级 typecho 至 1.0,测试评论

  2. ccc
    ccc 2015-05-30 21:13 回复

    小飞飞 好厉害, 这鸟文都看得懂

    1. 羽飞
      羽飞 2015-05-31 19:16 回复

      额~ 测试邮件回复

  3. 冰剑
    冰剑 2015-06-01 09:22 回复

    不明觉厉啊。。。。
    话说你才升级1.0吗??
    话说你为什么还没用多说呢?

    1. 羽飞
      羽飞 2015-06-17 23:44 回复

      是啊~ 估计也快要换了~

  4. 菠萝格格_from_博客志

    你竟然更新博客了

  5. 起司博客
    起司博客 2015-09-02 21:36 回复

    我是这么写的,连伪静态都完事了
    php5.6也不需要cgi.fix_pathinfo=1了
    if (!-e $request_filename) {
    rewrite ^(.*)$ /index.php$1 last;
    }

    location ~ .*\.php(\/.*)*$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }

  6. 起司博客
    起司博客 2015-09-02 21:53 回复

    1.0还是有CSRF跨站漏洞,升开发版

添加新评论 »