众所周知,我们不能在Yii等框架中使用原始MySQL查询。我希望在我的项目中使用mysql_escape_string
来运行Yii框架,以避免用户输入中的SQL注入。
我知道在PHP 5.5中不推荐使用mysql_escape_string
,并且我有一个PDO替代方案。 Yii框架中的替代方法是什么,以及mysql_escape_string()的PDO方式是什么?
答案 0 :(得分:7)
PDO中mysql_escape_string
的替代方法是使用预准备语句。以Yii为例:
$user = Yii::app()->db->createCommand()
->select('username, password')
->from('tbl_user')
->where('id=:id', array(':id'=>$_GET['userId']))
->queryRow();
(来自Yii参考文献http://www.yiiframework.com/doc/api/1.1/CDbCommand)
当您在预准备语句中通过占位符传递参数时,您可以防止SQL注入。
答案 1 :(得分:3)
使用准备好的查询转义查询参数'?'占位符有它的缺点(转义参数被移离查询主体,因此使得一些查询更难以使用;可能有一个额外的往返数据库,并不总是合理的;如果查询基本上是动态的,那么准备很多它们实际上可能需要服务器资源。)
Yii有quoteValue方法,可用于在准备好的查询表单之外转义查询参数。
答案 2 :(得分:2)
最好使用预备语句进行自动参数转义。但是,这种CDbConnection方法也应该做到这一点:
Yii::app()->db->quoteValue($your_value);
实质上,这引用了一个字符串值以供在查询中使用,它是PDO::quote()
的包装。
了解更多here。
答案 3 :(得分:1)
使用CHTMlPurifier:
// Example
$p = new CHtmlPurifier();
$user = Yii::app()->db->createCommand()
->select('username, password')
->from('tbl_user')
->where('id=:id', array(':id'=>$p->purify($_GET['userId']);))
->queryRow();
可以在get参数中添加恶意代码。
答案 4 :(得分:-1)
如果使用ActiveRecords
,则无需转义参数。
但是,如果您想使用mysql_escape_string
功能,可以尝试使用mysqli_escape_string()
我在执行高复杂性查询时使用了Yii
,如果使用模型并且我需要直接向数据库执行SQL查询,那么这会产生性能问题。
为此,您可以使用Yii::app()->db->createCommand($sql)->queryAll()
(或任何其他类似功能)。