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

时间:2022-09-23 08:00:50

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

摘要: 本文主要介绍在Linux操作系统下PHP网站服务器配置的方法与技巧,从Web服务器安全、PHP本身的安全配置分别介绍配置方法,很好地解决了PHP网站在Linux系统下的应用。

关键词: Linux操作系统PHP服务器安全配置

一、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里的:

[mail function];

For Win32 only.

SMTP=localhost,

For Win32 only.省略

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

二、PHP本身问题

1.远程溢出

PHP-4.1.省略/0204-exploits/7350fun

hsj.省略/misc/php3018_exp.txt

2.远程拒绝服务

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

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.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里设置的选项是对该定义的目录下所有脚本生效。

在讨论Linux系统下安全配置PHP服务器之前,我们应该了解PHP的safe_mode模式。

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手册。

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″,

?>

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

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。

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

参考文献:

[1]周星.基于PHP应用的数据共享与传递技术.北京:人民邮电出版社,2007.

[2]网胜工作室著.PHP410程序设计.北京:北京希望电子出版社,2006.

[3]仲进平.PHP网络开发技术程序设计[M].北京:人民邮电出版社,2007.

[4]飞思科技产品研发中心.PHP网站设计与实现.北京:电子工业出版社,2004.

上一篇:由中职计算机课堂的实效性谈计算机教学对策 下一篇:PHP连接Oracle数据库的操作技巧