yii database操作绑定参数防止sql注入

Posted markiki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yii database操作绑定参数防止sql注入相关的知识,希望对你有一定的参考价值。

绑定参数(Binding Parameters)

当使用带参数的 SQL 来创建数据库命令时, 你几乎总是应该使用绑定参数的方法来防止 SQL 注入攻击,例如:

$post = Yii::$app->db->createCommand(‘SELECT * FROM post WHERE id=:id AND status=:status‘)
           ->bindValue(‘:id‘, $_GET[‘id‘])
           ->bindValue(‘:status‘, 1)
           ->queryOne();

在 SQL 语句中,你可以嵌入一个或多个参数占位符(例如,上述例子中的 :id )。 一个参数占位符应该是以冒号开头的字符串。 之后你可以调用下面绑定参数的方法来绑定参数值:

下面的例子展示了几个可供选择的绑定参数的方法:

$params = [‘:id‘ => $_GET[‘id‘], ‘:status‘ => 1];

$post = Yii::$app->db->createCommand(‘SELECT * FROM post WHERE id=:id AND status=:status‘)
           ->bindValues($params)
           ->queryOne();
           
$post = Yii::$app->db->createCommand(‘SELECT * FROM post WHERE id=:id AND status=:status‘, $params)
           ->queryOne();

绑定参数是通过 预处理语句 实现的。 除了防止 SQL 注入攻击,它也可以通过一次预处理 SQL 语句, 使用不同参数多次执行,来提升性能。例如:

$command = Yii::$app->db->createCommand(‘SELECT * FROM post WHERE id=:id‘);

$post1 = $command->bindValue(‘:id‘, 1)->queryOne();
$post2 = $command->bindValue(‘:id‘, 2)->queryOne();
// ...

因为 bindParam() 支持通过引用来绑定参数, 上述代码也可以像下面这样写:

$command = Yii::$app->db->createCommand(‘SELECT * FROM post WHERE id=:id‘)
              ->bindParam(‘:id‘, $id);

$id = 1;
$post1 = $command->queryOne();

$id = 2;
$post2 = $command->queryOne();
// ...

请注意,在执行语句前你将占位符绑定到 $id 变量, 然后在之后的每次执行前改变变量的值(这通常是用循环来完成的)。 以这种方式执行查询比为每个不同的参数值执行一次新的查询要高效得多得多。

信息: 参数绑定仅用于需要将值插入到包含普通SQL的字符串中的地方。 在 Query Builder 和 Active Record 等更高抽象层的许多地方,您经常会指定一组将被转换为 SQL 的值。 在这些地方,参数绑定是由 Yii 内部完成的,因此不需要手动指定参数。

以上是关于yii database操作绑定参数防止sql注入的主要内容,如果未能解决你的问题,请参考以下文章

玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入

sql注入与防止SQL注入之参数化处理

MySQL参数化有效防止SQL注入

yii2过滤xss代码,防止sql注入

ThinkPHP如何防止SQL注入?

传递键值对是不是也可以防止 SQL 注入攻击?