PHP温故知新(二)
2、安装和配置
安装这里要注意两点,是之前没有在意的:
1、将php.ini文件中的 cgi.fix_pathinfo设置为0
设置为0是为了解决一个安全漏洞,假如我们现在有这样一个URL:http://www.test.com/11.jpg 这样打开是一张图片,我们现在把URL改一下:http://www.test.com/11.jpg/a.php
打开之后见下图:
这些是图片文件的二进制内容,下面我们再新建一个PHP文件,里面代码为:
<?php echo "我是漏洞!";
命名为11.jpg ,虽然是图片格式,但是里面内容是PHP代码。之后我们再执行一次之前的URL:http://www.test.com/11.jpg/a.php 结果为:
执行的是PHP代码。如果在某个论坛中,我们上传了一个图片格式,但内容是PHP代码的文件,之后我们运行这个文件,就可以链接数据库等任何操作,甚至可以删除数据。
为什么会这样呢?
如果开启 cgi.fix_pathinfo这个选项, 那么就会触发在PHP中的如下逻辑:
/* * if the file doesn't exist, try to extract PATH_INFO out * of it by stat'ing back through the '/' * this fixes url's like /info.php/test */ if (script_path_translated && (script_path_translated_len = strlen(script_path_translated)) > 0 && (script_path_translated[script_path_translated_len-1] == '/' || ....//以下省略.
PHP会认为SCRIPT_FILENAME是11.jpg, 而a.php是PATH_INFO, 然后PHP就把11.jpg当作一个PHP文件来解释执行。
所以要把 cgi.fix_pathinfo 设置为0。请关闭fix_pathinfo(默认是开启的)。
部分摘抄自:http://www.laruence.com/2010/05/20/1495.html
2、php-fpm.conf 配置文件,确保 php-fpm 模块使用 www-data 用户和 www-data 用户组的身份运行
这样做应该也是为了安全考虑,具体不详,希望大家告知。
3、pecl 扩展库安装
pecl是PHP扩展库,许多扩展可以通过
pecl install extname
安装,linux下安装完成之后在php.ini里加上
extension=extname.so #以memcache为例 extension=memcache.so
另外还可以用dl()方法动态加载扩展
<?php
//PHP_SHLIB_SUFFIX 在win系统下为dll,在linux下为so
if (!extension_loaded('sqlite')){
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : ''; dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
4、phpize编译
有时候不能用 pecl 安装命令。这可能是因为在防火墙后面,或者是因为想要安装的扩展库还没有 PECL 兼容的包,例如 SVN 中尚未发布的扩展库。如果要编译这种扩展库,可以用更底层的编译工具来手工进行编译。
phpize 命令是用来准备 PHP 扩展库的编译环境的。
$ cd extname $ phpize $ ./configure $ make # make install