- A+
对于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
会进行设置,所以一般不存在这个问题。
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-