用户名: 密码: 忘记密码? 注册
收藏此问题 发表新评论

phpcms v9安全性相比phpcms 2008是明显的退步--论v9中的SQL注入

本帖最后由 xuer 于 2013-4-24 13:04 编辑

phpcms v9安全性相比phpcms 2008是明显的退步--论v9中的SQL注入漏洞

网上搜索 phpcms v9 sql注入漏洞,结果出现一大堆的问题,这些问题显然是V9框架中没处理好造成的


我从技术上分析,为何v9的SQL注入问题比phpcms 2008要严重很多?

先分析 2008中对GPC变量的处理, phpcms 2008在include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了mysql_real_escape_string,PHP手册上对这个函数的描述:
    string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
    本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集,因此可以安全用于 mysql_query()。 


也就是说2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,但2008中这样的处理方式并不好,原因后面分析。

再看 V9中的处理方式,入口文件phpcms/libs/classes/param.class.php中调用
    $_POST = new_addslashes($_POST);
    $_GET = new_addslashes($_GET);
    $_REQUEST = new_addslashes($_REQUEST);
    $_COOKIE = new_addslashes($_COOKIE);


new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,再看PHP手册中对magic_quotes_gpc的处理:

    Warning
    This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.


复制代码
也就是说PHP 5.3开始,已经不建议使用magic_quotes_gpc了,PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是有原因的

    性能 由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。

    不便 由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。

    安全问题 事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。
    请阅读以下几个文章,可得知为何变量使用addslashes处理后仍然造成SQL注入,
    PHP字符编码绕过漏洞--addslashes、mysql_real_escape漏洞
    http://blog.csdn.net/zhuizhuziwo/article/details/8525789
    addslashes:会导致SQL注入漏洞
    http://blog.csdn.net/felio/article/details/1226569

针对这个问题,PDO扩展而生,它主要解决两个问题:
批量查询时使用prepare提升查询性能
使用参数化查询从根本上杜绝SQL注入


php 5.1+默认自带了PDO扩展,新版本中更是强调了使用PDO作为默认数据库驱动。

但不幸的是,V9还在使用以下代码:

    if(!get_magic_quotes_gpc()) {
    $_POST = new_addslashes($_POST);
    $_GET = new_addslashes($_GET);
    $_REQUEST = new_addslashes($_REQUEST);
    $_COOKIE = new_addslashes($_COOKIE);
    }


这些代码,在PHP 5.3中将引发一个E_DEPRECATED警告。而且在PHP 5.4环境中,v9无法正常运行。

我实在想不明白,为何phpcms新团队成员没有处理好最为基础的SQL注入问题呢?其实2008处理方式就比v9好很多--尽管不是很合理。


可以预见的是,由于v9 底层数据库封装的缺陷,其SQL注入问题会越来越多,使用打补丁的方式只是治标不治本,无根治。

建议点:
1. 不要在入口中使用addslashes给GPC转义--并不是所有变量都需要入库的
2. 不要使用get_magic_quotes_gpc机制了, PHP新版已经去掉这个功能
3. 使用PDO参数化查询,从根本上杜绝SQL注入。是的,正确使用PDO prepare可以100%杜绝SQL注入

ThinkPHP 3.1框架中,也依赖addslashes来防止SQL注入,而引发了更严重的SQL注入问题。



再来分析 2008中的处理方式的不合理之处:
1. 入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能
    连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序
2. 正确是应该在数据入库的时候,再进行转义处理
3. 虽然phpcms 2008的处理方式性能上有损失,但是却很好地从根源上杜绝解决了SQL注入问题

当然,作为曾经钟胜辉手中的phpcms 20087产品,这已经是古话了。

可以感觉到的是,phpcms 离开了钟胜辉,产品的生命、灵性正在慢慢消失。也只有钟胜辉最懂phpcms,其它开发人员无法替代。

phpcms正在走向没落,这是一个残酷的事实,无论你是否承认。
昵称: xuer  时间: 2013-04-24 13:02:57
phpcms v9这个框架还是不错的 、对了 老兄。你有没有办法在phpcms v9框架下进行扩展。把mysql.class.php改成PDO的。里面预处理的不知道要怎么弄
昵称: xiaogui32  时间: 2013-04-30 09:12:04
我在试着做pdo的扩展,希望可以
昵称: Eyelid  时间: 2013-06-06 19:46:08
发表评论
昵称:
内容:
验证: