我们在开发的时候会对用户的输入做特殊字符过滤,一般的做法就是检测一下magic_quotes_gpc选项,如果为off,就需要调用addslashes对特殊字符进行转义,然后再构建sql语句:
<?php //若magic_quotes_gpc=off,则get_magic_quotes_gpc返回false,此时就需要手动转义 if(!get_magic_quotes_gpc()) { $xxx = addslashes($_POST['xxx']); } ?>
经过上述处理后,我们就能安全地构建sql语句。
yii框架怎么防止sql 注入的呢?
yii框架其实已经自动帮我们做了很多事情,包括上述所讲的过滤特殊字符,前提是要用对接口,比如我有一个搜索需求(如本博客的搜索功能),刚开始的时候,我是这么做的:
<?php $criteria = new CDbCriteria(); $criteria->addCondition("title like '%".$_GET['s']."%'");//很明显有sql injection ?>
有经验的开发者一看就知道有bug,那么使用yii框架该如何避免此类问题呢?原则:不要直接写sql,一切交由yiiframework处理。
如果我们换一个criteria接口:
<?php $criteria = new CDbCriteria(); $criteria->addSearchCondition('title', $_GET[''s]); ?>
不直接写sql,调用addSearchCondition接口,yii会自动帮我们过滤特殊字符,搞定!