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

 

posted @ 2016-02-18 14:07  scofi  阅读(372)  评论(0编辑  收藏  举报