如何在Yii框架中使用mysql_escape_string()?

时间:2013-02-15 15:08:09

标签: php mysql pdo yii mysql-escape-string

众所周知,我们不能在Yii等框架中使用原始MySQL查询。我希望在我的项目中使用mysql_escape_string来运行Yii框架,以避免用户输入中的SQL注入。

我知道在PHP 5.5中不推荐使用mysql_escape_string,并且我有一个PDO替代方案。 Yii框架中的替代方法是什么,以及mysql_escape_string()的PDO方式是什么?

5 个答案:

答案 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()(或任何其他类似功能)。