频道栏目
首页 > 资讯 > XML教程 > 正文

PHP安全配置(2)

16-01-06        来源:[db:作者]  
收藏   我要投稿
三、PHP本身的安全配置

PHP的配置非常机动,可以通过php.ini, httpd.conf, .htaccess文件(该目录必需设置了AllowOverride All或Options)进行设置,还可以在脚本程序里应用ini_set()及其他的特定的函数进行设置。通过phpinfo()和get_cfg_var()函数可以得到配置选项的各个值。

假如配置选项是唯一PHP_INI_SYSTEM属性的,必需通过php.ini和httpd.conf来修正,它们修正的是PHP的Master值,但修正之后必需重启apache才干生效。其中php.ini设置的选项是对Web服务器所有脚本生效,httpd.conf里设置的选项是对该定义的目录下所有脚本生效。

假如还有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL属性的选项就可以应用.htaccess文件设置,也可以通过在脚本程序自身用ini_set()函数设定,它们修正的是Local值,改了以后马上生效。但是.htaccess只对当前目录的脚本程序生效,ini_set()函数只对该脚本程序设置ini_set()函数以后的代码生效。各个版本的选项属性可能不尽雷同,可以用如下命令查找当前源代码的main.c文件得到所有的选项,以及它的属性:

# grep PHP_INI_ /PHP_SRC/main/main.c



在讨论PHP安全配置之前,应当好好懂得PHP的safe_mode模式。

1、safe_mode

safe_mode是唯一PHP_INI_SYSTEM属性,必需通过php.ini或httpd.conf来设置。要启用safe_mode,只需修正php.ini:

safe_mode = On
或者修正httpd.conf,定义目录:

Options FollowSymLinks
php_admin_value safe_mode 1




重启apache后safe_mode就生效了。启动safe_mode,会对很多PHP函数进行限制,特别是和系统相干的文件打开、命令履行等函数。

所有把持文件的函数将只能把持与脚本UID雷同的文件,比如test.php脚本的内容为:


几个文件的属性如下:
# ls -la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr-x 16 root root 384 Jul 18 12:02 ..
-rw-r--r-- 1 root root 4110 Oct 26 2002 index.html
-rw-r--r-- 1 www-data www-data 41 Jul 19 19:14 test.php



在浏览器恳求test.php会提示如下的错误信息:

Warning: SAFE MODE Restriction in effect. The script whose uid/gid is 33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in /var/www/test.php on line 1

假如被把持文件所在目录的UID和脚本UID一致,那么该文件的UID即使和脚本不同也可以拜访的,不知这是否是PHP的一个漏洞还是另有隐情。所以php脚本属主这个用户最好就只作这个用处,尽对禁止应用root做为php脚本的属主,这样就达不到safe_mode的后果了。

假如想将其放宽到GID比拟,则打开 safe_mode_gid可以考虑只比拟文件的GID,可以设置如下选项:

safe_mode_gid = On

设置了safe_mode以后,所有命令履行的函数将被限制只能履行php.ini里safe_mode_exec_dir指定目录里的程序,而且shell_exec、`ls -l`这种履行命令的方法会被禁止。假如确实需要调用其它程序,可以在php.ini做如下设置:

safe_mode_exec_dir = /usr/local/php/exec

然后拷贝程序到该目录,那么php脚本就可以用system等函数来履行该程序。而且该目录里的shell脚本还是可以调用其它目录里的系统命令。

safe_mode_include_dir string

当从此目录及其子目录(目录必需在 include_path 中或者用完整路径来包含)包含文件时超出 UID/GID 检查。

从 PHP 4.2.0 开端,本指令可以接收和 include_path 指令类似的作风用分号隔开的路径,而不只是一个目录。

指定的限制实际上是一个前缀,而非一个目录名。这也就是说“safe_mode_include_dir = /dir/incl”将答应拜访“/dir/include”和“/dir/incls”,假如它们存在。假如您盼看将拜访把持在一个指定的目录,那么请在结尾加上一个斜线,例如:“safe_mode_include_dir = /dir/incl/”。

safe_mode_allowed_env_vars string

设置某些环境变量可能是埋伏的安全缺口。本指令包含有一个逗号分隔的前缀列表。在安全模式下,用户只能转变那些名字具有在这里供给的前缀的环境变量。默认情况下,用户只能设置以 PHP_ 开头的环境变量(例如 PHP_FOO = BAR)。

注: 假如本指令为空,PHP 将应用户可以修正任何环境变量!

safe_mode_protected_env_vars string

本指令包含有一个逗号分隔的环境变量的列表,终极用户不能用 putenv() 来转变这些环境变量。甚至在 safe_mode_allowed_env_vars 中设置了答应修正时也不能转变这些变量。

固然safe_mode不是万能的(低版本的PHP可以绕过),但还是强烈建议打开安全模式,在必定程度上能够避免一些未知的攻击。不过启用safe_mode会有很多限制,可能对利用带来影响,所以还需要调剂代码和配置才干和谐。被安全模式限制或屏蔽的函数可以参考PHP手册。

讨论完safe_mode后,下面联合程序代码实际可能呈现的标题讨论如何通过对PHP服务器真个配置来避免呈现的漏洞。

2、变量滥用

PHP默认register_globals = On,对于GET, POST, Cookie, Environment, Session的变量可以直接注册玉成局变量。它们的注册次序是variables_order = 'EGPCS'(可以通过php.ini修正),同名变量variables_order右边的笼罩左边,所以变量的滥用极易造成程序的混乱。而且脚本程序员往往没有对变量初始化的习惯,像如下的程序片段就极易受到攻击:

//test_1.php
if ($pass == 'hello')
$auth = 1;

if ($auth == 1)
echo 'some important information';
else
echo 'nothing';
?>



攻击者只需用如下的恳求就能绕过检查:

http://victim/test_1.php?auth=1

这固然是一个很弱智的错误,但一些著名的程序也有犯过这种错误,比如phpnuke的远程文件拷贝漏洞:http://www.securityfocus.com/bid/3361

PHP-4.1.0宣布的时候建议封闭register_globals,并供给了7个特别的数组变量来应用各种变量。对于从GET、POST、COOKIE等来的变量并不会直接注册成变量,必需通过数组变量来存取。PHP-4.2.0宣布的时候,php.ini默认配置就是register_globals = Off。这使得程序应用PHP自身初始化的默认值,一般为0,避免了攻击者把持判定变量。

解决方法:

配置文件php.ini设置register_globals = Off。

请求程序员对作为判定的变量在程序最开端初始化一个值。

3、文件打开

极易受攻击的代码片段:

//test_2.php
if (!($str = readfile('$filename'))) {
echo('Could not open file: $filename
\n');
exit;
}
else {
echo $str;
}
?>



由于攻击者可以指定任意的$filename,攻击者用如下的恳求就可以看到/etc/passwd:

http://victim/test_2.php?filename=/etc/passwd

如下恳求可以读php文件本身:

http://victim/test_2.php?filename=test_2.php

PHP中文件打开函数还有fopen(), file()等,假如对文件名变量检查不严就会造成服务器重要文件被拜访读取。

解决方法:

如非特别需要,把php的文件把持限制在web目录里面。以下是修正apache配置文件httpd.conf的一个例子:


php_admin_value open_basedir /usr/local/apache/htdocs




重启apache后,/usr/local/apache/htdocs目录下的PHP脚本就只能把持它自己目录下的文件了,否则PHP就会报错:

Warning: open_basedir restriction in effect.

File is in wrong directory in *** on line xx.

应用safe_mode模式也能避免这种标题,前面已经讨论过了。
相关TAG标签
上一篇:递回列出所有文件和目录
下一篇:使用 XML 模板 (MSSQL手册)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站