众所周知,我们不能在 Yii 等框架中使用原始 MySQL 查询。我想mysql_escape_string
在我的项目中使用在 Yii 框架中运行的项目来摆脱用户输入中的 SQL 注入。
我知道它mysql_escape_string
在 PHP 5.5 中已被弃用,并且我有一个 PDO 替代方案。Yii 框架中的替代方案以及 mysql_escape_string() 的 PDO 方式是什么?
众所周知,我们不能在 Yii 等框架中使用原始 MySQL 查询。我想mysql_escape_string
在我的项目中使用在 Yii 框架中运行的项目来摆脱用户输入中的 SQL 注入。
我知道它mysql_escape_string
在 PHP 5.5 中已被弃用,并且我有一个 PDO 替代方案。Yii 框架中的替代方案以及 mysql_escape_string() 的 PDO 方式是什么?
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 注入。
最好使用准备好的语句进行自动参数转义。但是,这种 CDbConnection 方法也应该可以解决问题:
Yii::app()->db->quoteValue($your_value);
本质上,这引用了一个用于查询的字符串值,它是PDO::quote()
.
在这里阅读更多。
使用准备好的查询“?”转义查询参数 占位符有其缺点(转义参数从查询主体移开,因此使某些查询更难处理;可能会有额外的数据库往返,这并不总是合理的;如果查询本质上是动态的,那么准备很多可能实际上会占用服务器资源)。
Yii 有quoteValue方法,可用于在准备好的查询表单之外转义查询参数。
使用 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();
可能在获取参数中添加恶意代码。
如果使用 . 你不需要转义参数ActiveRecords
。
但是,如果您想使用该mysql_escape_string
功能,您可以尝试使用mysqli_escape_string()
我Yii
在执行高复杂性查询时使用了它,如果使用模型会出现性能问题,并且我需要直接对数据库执行 SQL 查询。
为此,您可以使用Yii::app()->db->createCommand($sql)->queryAll()
(或任何其他类似功能)。