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