5

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

我知道它mysql_escape_string在 PHP 5.5 中已被弃用,并且我有一个 PDO 替代方案。Yii 框架中的替代方案以及 mysql_escape_string() 的 PDO 方式是什么?

4

5 回答 5

10

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 注入。

于 2013-02-15T15:13:03.283 回答
5

最好使用准备好的语句进行自动参数转义。但是,这种 CDbConnection 方法也应该可以解决问题:

Yii::app()->db->quoteValue($your_value);

本质上,这引用了一个用于查询的字符串值,它是PDO::quote().

在这里阅读更多。

于 2018-06-01T05:49:11.903 回答
3

使用准备好的查询“?”转义查询参数 占位符有其缺点(转义参数从查询主体移开,因此使某些查询更难处理;可能会有额外的数据库往返,这并不总是合理的;如果查询本质上是动态的,那么准备很多可能实际上会占用服务器资源)。

Yii 有quoteValue方法,可用于在准备好的查询表单之外转义查询参数。

于 2013-12-09T13:54:52.353 回答
0

使用 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();

可能在获取参数中添加恶意代码。

于 2013-02-15T16:33:37.387 回答
0

如果使用 . 你不需要转义参数ActiveRecords

但是,如果您想使用该mysql_escape_string功能,您可以尝试使用mysqli_escape_string()

Yii在执行高复杂性查询时使用了它,如果使用模型会出现性能问题,并且我需要直接对数据库执行 SQL 查询。

为此,您可以使用Yii::app()->db->createCommand($sql)->queryAll()(或任何其他类似功能)。

于 2013-12-09T14:22:09.397 回答