|
[ 文件系统安全 ]
安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用 open_basedir 选现来指定一个你必须访问的目录。如果你指定了一个目录,PHP将拒绝访问除了该目录和该目录子目录的其他目录。open_basedir 选项能够工作在安全模式之外。
限制文件系统只能访问 /tmp 目录,那么设置选项为:
open_basedir = /tmp
[ 函数访问控制 ]
你能够在 disable_functions 选项中使用逗号分割来设定函数名,那么这些函数将在PHP脚本中被关闭。这个设置能够工作在安全模式之外。
disable_functions = dl
当然,同样的你能够使用 disable_classes 选项来关闭对一些类的访问。
[ 数据库安全 ]
假设你的PHP脚本中包含一个基于表单值来执行的Mysql查询:
$sql = “UPDATE mytable SET col1 = ” . $_POST["value"] . ”
WHERE col2 = ’somevalue’”;
$res = mysql_query($sql, $db);
你希望 $_POST["value"] 包含一个整数值来更新你的列 col1。可是,一个恶意用户能够输入一个分号在表单字段里,接着,是一段他/她想被任意执行的SQL语句。
举例,假设下面是 $_POST["value"] 提交的值:
0; INSERT INTO admin_users (username, password)
VALUES (’me’, ‘mypassword’);
那么当这个查询发送给Mysql查询的时候,那么就变成了下面这条SQL:
UPDATE mytable SET col1 = 0;
INSERT INTO admin_users (username, password)
VALUES (’me’, ‘mypassword’);
WHERE col2 = ’somevalue’;
这 明显是一个有害的查询!首先这个查询会在 mytable 表里更新 col1。这个并没有什么麻烦的,但是第二个表达式,它将执行 INSERT 表达式来插入一个能登陆的新管理员。第三个表达式就废弃了,但同时SQL解析器将抛出一个错误,这个有害的查询才完成。这个攻击就是大家常说的 SQL injection(注:SQL注入)。
当然,SQL injection 存在一个问题,对方必须了解你的数据库结构。在这个例子中,攻击者是知道你有一个表 admin_users,并且知道包含 username 和 password字段,同时,存储的密码是没有加密的。
除了你自己,一般的网站访问者是不知道这些关于数据库的信息。可是,如果你使用了一个开发源代码的在线电子商务程序,或者使用一个自由的讨论版程序,这些数据表的定义都是已知的,或者有一些用户能够访问到你的数据库。
此 外,你的脚本输出会提示一个查询错误,这些信息里包含了很多关于数据库结构的重要信息。在一个正常工作的网站上,你应该考虑设置 display_errors 选项为 off,并且使用 log_errors 来代替 display_errors ,把警告和错误信息插入到文件中。
(数据库权限:它是一个非常重要的东西,你只有正确的权限,才能通过脚本正确的连接数据库。你应该不要在 脚本中使用管理员去连接数据库。如果你这么做,那么一个攻击者将可能获取全部的数据库权限,并且包括其他相同服务器的权限。攻击者将可能运行 GRANT 或 CREATE USER 命令来获取更多的访问权限。 )
如果你要防止 SQL injection 攻击,你必须保证用户表单里提交的内容不是一个能够执行的SQL表达式。
前一个例子中,我们使用一个整型值来进行更新。如果在单引号后面跟上一个字符串,这个攻击者在分号之前必须提交一个闭合的引用在整个SQL表达式中。可是,当 magic_quotes_gpc 选项是开启的时候,在Web表单中提交的引号将自动被转义。
为 了防止被恶意的攻击者进行 SQL injection攻击,你应该总是确认提交的数据是合法的。如果你需要的是一个整数值,那么你可以使用 is_numeric 函数来测试这个表达值,或者使用 settype 函数来转换为一个数字,清除任何一个傻傻的SQL语句。
如果你开发的程序需要几个提交的值在一个SQL表达式里,你能够使用 sprintf 函数来构建一个SQL字符串,使用格式化字符来指示数据类型的每个值。看下面的例子:
$sql = sprintf(”UPDATE mytable SET col1 = %d
WHERE col2 = ‘%s’”,
$_POST["number"],
mysql_escape_string($_POST["string"]));
在上一个例子中,整个Mysql的数据已经被使用,所以这个字符串已经通过 mysql_escape_string 函数进行过滤。对于其他数据库,你可以使用 addslashes 函数进行转义,或者使用其他方法。
| 阻止Alert攻击代码 | 12-14 |
| Arp反欺骗策略 | 11-29 |
| 如何杜绝iframe挂马 | 11-29 |
| ARP欺骗解决终极办法(传说中的虚 | 11-06 |
| 打造抵御SQL注入攻击的MS SQL服务 | 10-23 |
| ASP木马Webshell安全解决方案 | 09-22 |
| ASP登陆验证页应做的安全问题 | 08-25 |
| 防黑主要是日常维护的5个步骤总结 | 08-25 |
| Windows Server2003安全配置整理 | 08-20 |
| 安全虚拟主机配置 | 07-18 |
| ASP木马Webshell的安全防范解决办 | 06-19 |
| CC DDOS攻击器的原理及防范方法 | 06-13 |