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 内部完成的,因此不需要手动指定参数。

原文地址:https://www.cnblogs.com/markiki/p/10645122.html

时间: 2024-08-15 14:36:03

yii database操作绑定参数防止sql注入的相关文章

ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁

在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检查,看是用户输入的内容是否有危险的sql.如果每个地方都要加有几个缺点: 1.工作量大 2.容易遗漏 3.不容易维护 下面我通过写一个过滤防止sql的特性类,对Action执行前对Action的参数进行处理,如果有其值有sql语句,就会这些非法字符替换为空字符串. 一.sql注入的例子: 上面的输入

ASP.NET MVC 5使用Filter过滤Action参数防止sql注入

在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检查,看是用户输入的内容是否有危险的sql.如果每个地方都要加有几个缺点: 1.工作量大 2.容易遗漏 3.不容易维护 下面我通过写一个过滤防止sql的特性类,对Action执行前对Action的参数进行处理,如果有其值有sql语句,就会这些非法字符替换为空字符串. 一.sql注入的例子: 上面的输入

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

作者:白狼 出处:www.manks.top/article/yii2_filter_xss_code_or_safe_to_database 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 实际开发中,涉及到的语言也好,框架也罢,web安全问题总是不可避免要考虑在内的,潜意识中的考虑. 意思就是说喃,有一条河,河很深,在没办法游过去的情况下你只能沿着河上唯一的一座桥走过去. 好啦,我们看看在yii框架的不同版本中是怎么处

C#编写程序操作数据库如何防止SQL注入漏洞的发生

我们在使用C# 编程的时候,经常会遇到操作数据库的地方,如果我们不注意,可能编写的代码就是下面这样 在前台定义了一个文本框,name值为btnName;  定义了一个查询按钮,name值为btnSearch,Click事件为 btnSearch_Click, private void btnSearch_Click(object sender, RoutedEventArgs e)         {             using (SqlConnection conn = new Sql

记录一下学习PDO技术防范SQL注入的方法

最近学习了使用PDO技术防范SQL注入的方法,在博客里当做一次笔记.若果有新的感悟在来添上一笔,毕竟也是刚开始学习.一. 什么是PDO PDO全名PHP Data Object PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据. 二.如何去使用PDO防范SQL注入?/防范sql注入这里使用quate()方法过滤特殊字符和通过预处理的一些方式以及bindPar

mysql绑定参数bind_param原理以及防SQL注入

假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aaa"; $pwd = "pwd"; $sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'"; echo $sql; //输出 SELECT * FROM ta

SQL注入之SQLmap入门

什么是SQLmap? SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令). 读者可以通过位于SourceForge的官方网站下载SQLmap源码:http://sourceforge.net/projects/sqlmap/ SQLmap的作者是谁? Bernardo DameleAssumpcao Guimaraes (@inquisb),读者可以通过[email protected]与他取得联

常见sql注入的类型

这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二次注入攻击 宽字节注入攻击 base64注入攻击 cookie注入攻击-http请求头参数注入 XFF注入攻击-http请求头参数注入 知道绝对路径的注入 0x01最基础的注入-union注入攻击 判断是get型还是post型注入: 找到正确的闭合规则: order by 查询字段数: union

DVWA(三):SQL injection 全等级SQL注入

(本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患 用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据或进行数据库操作. 三.关于SQL注入需要注意的几个点: 1.SQL注入的攻击流程: (1)判断注入点:一般分为三大类 GET.POST参数触发SQL注入,Cookie触发注入 (2)判断注入类