PHP安全《PHP Security》

http://tech.ddvip.com   2007年08月25日    社区交流

内容摘要:PHP勿庸置疑是非常强大的服务器端脚本语言,但是强大的功能总是伴随着重大的危险,在这章里,你将学习到使用PHP的安全模式来阻止一些PHP潜在的危险因素。

  [ 文件系统安全 ]

  安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用 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注入)。

来源:CSDN    作者:heiyeluren    责编:豆豆技术应用

正在加载评论...