当前位置: > Linux服务器 > 服务器设置 >

Linux系统下配置PHP服务器的技巧

时间:2015-01-14 19:52来源:linux.it.net.cn 作者:IT

一、Web服务器安全

    PHP是Web服务器的一个模块功能,所以要想使PHP拥有较安全的配置,首先要保证Web服务器的安全,当然Web服务器要安全就必须先保证系统安全。PHP可以和各种Web服务器结合。这里只讨论Apache。笔者建议以chroot方式安装启动Apache,这样即使Apache和PHP及其脚本出现漏洞,受影响的也只有这个禁锢的系统,不会危害实际系统。但足我们使用chroot的Apache后.会给应用带来一定的麻烦,比如连接mysql时必须用“127.0.0.1”地址,使用tcp连接而不能用localhost实现socket连接,这在效率上会稍微差一点。mail函数发送邮件也存在一定的问题,因为php.ini证里的:

公式

    这都是是针对Win32平台的,所以我们需要在chroot环境下调整好sendmail。

二、PHP本身问题

    2.1 远程溢出

    PHP-4.1.2以下的所有版本都存在文件上传远程缓冲区溢出漏洞,而且攻击程序已经广泛流传,成功率非常高:

    http://packetstormsecurity.org/0204-exploits/7350fun

    http://hsj.shadowpenguin.org/misc/php3018_exp.txt

    2.2 远程拒绝服务

    PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST请求处理远程漏洞,虽然不能获得本地用户权限。但是也能造成拒绝服务。

    2.3 safe_mode

    PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函数绕过safe_mode限制执行命令漏洞。从4.0.5版本开始,mail函数增加了第五个参数,设计者可以突破safe_mode的限制执行命令。其中4.0.5版本突破非常简单,只需用分号隔开后面加shell命令就可以了。

三、PHP本身的安全配置

    PHP的配置非常灵活,我们可以通过php.ini、httpd.cont、htAccess文件(该目录必须设置了AllowOverride All或Options)进行设置,还可以在脚本程序里使用ini_ser()和其他的特定函数进行设置,通过phpinfo()和get_cfg_var()函数可以得到配置选项的各个值。

    如果配置选项是唯一PHP_INI_SYSTEM属性的,我们必须通过php.ini和httpd.conf来修改,其修改的是PHP的Masterf值,但修改之后必须承启apache才能生效。其中php.ini设置的选项是对Web服务器所有脚本生效,httpd.conf里设置的选项是对该定义的目录下所有脚本生效。在讨论Linux系统下安全配置PHP服务器之前,我们应该了解PHP的safe_mode的模式。

    3.1 safe_mode

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

    safe_mode=On

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

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

    3.2 变量滥用

    PHP默认register_globals=On,对于Get、Post、Cookie、Environment、Session的变量我们可以直接注册成全局变量。它们的注册顺序是variables_order=“EGPCS”(可以通过php.ini修改),同名变量variables_order右边的覆盖左边,所以变量的滥用极易造成程序的混乱,而且脚本程序员往往没有对变量初始化的习惯,像如下的程序片断就极易受到攻击:

公式

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

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

    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。

    这要求程序员对作为判断的变量在程序最开始初始化为一个值。

(责任编辑:IT)
------分隔线----------------------------