4
一/09
2

PHP Architect’s Guide to PHP Security [3]



今天继续翻译PHP Architect’s Guide to PHP Security这本书的第三章《SQL注入》。由于第二章XSS有专门的书籍介绍,以后会专门翻译,所以暂时跳过XSS,先对SQL Injection进行介绍。

SQL注入是另一种常见的漏洞(针对XSS来说),是由于对输入数据过滤不严导致的。它不像XSS是直接针对站点的用户,而是直接破坏站点本身,特别是数据库。SQL注入的目的是插入任意数据,常常是插入一条被数据库执行的SQL语句。这些潜伏的被插入语句常常执行很多操作,从获取数据到更改或删除数据库信息。

// supposed input
$name = “ilia’; DELETE FROM users;”;
mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);
这段功能本来是想从user表中获取匹配name字段的数据,一般情况下,name变量是一些字母数字和空白字符的组合,比如字符串“ilia”,但如果我们附加了查询语句,这条注入的查询语句将会删除users表中的所有记录。(幸运的是,mysql的mysql_query函数不允许堆查询,在一次调用中不允许执行多次查询,但是SQLite和postgresql扩展是可以的。

PHP的自动转义机制GPC提供了一些基本保护,如果启用了magic_quotes_gpc,将会对单引,双引等一些字符进行转义(在前面加反斜线)。但是magic quotes不包括所有需要转义的字符,并且这个特性不总是开启的。所以你需要自己用代码来阻止SQL注入。

php的很多数据库扩展有自己专门的转义机制,例如Mysql扩展的mysql_real_escape_string()函数。

if (get_magic_quotes_gpc()) {
  $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);
在调用数据库扩展的转义机制之前,首先要对magic quotes的状态进行检查,如果magic guotes启用了,则要去掉它可能添加的反斜线,以免输入数据被转义2次。

待续。。。有点累了。

 


相关文章

关键字: ,
评论 (2) Trackbacks (0)
  1. pangpig
    09:57 on 一月 4th, 2009

    顶一下!继续努力翻译哈!

    terrysco 于 2009-1-4 12:33:48 回复

    现在才知道翻译是多么的耗时耗力啊。

  2. emeraldren
    11:55 on 一月 4th, 2009

    昨晚写这么晚啊!嗯,加油,我会经常来看的,谢谢!学习了。

发表评论

No trackbacks yet.