mybatis防注入

news/2024/11/9 5:07:03/

1.SQL防注入

mybatis语句中要使用 #{xxx}防止SQL注入,${xxx}只是简单替换占位符,有注入的风险

例子:

1.1

"getNameByUserId" resultType="String"> SELECT name FROM user where id = #{userId}

可以看到输入的参数是String类型的userId,当我们传入userId="34;drop table user;"后,打印的语句是这样的:

select name from user where id = ?

这就得益于mybatis在底层实现时使用预编译语句。数据库在执行该语句时,直接使用预编译的语句,然后用传入的userId替换占位符?就去运行了。不存在先替换占位符?再进行编译的过程,因此SQL注入也就没有了生存的余地了。

mybatis是如何做到sql预编译的呢?其实框架底层使用的正是PreparedStatement类。PreparedStaement类不但能够避免SQL注入,因为已经预编译,当N次执行同一条sql语句时,节约了(N-1)次的编译时间,从而能够提高效率。

【底层实现原理】

      其原因就是:采用了JDBC的PreparedStatement,就会将sql语句:“select id,no from user where id =?” 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该SQL语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如select,from,where,and,or,order by等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些SQL命令的执行,必须先得通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为SQL命令来执行的,只会被当做字符串字面值参数。所以的sql语句预编译可以防御SQL注入。而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。

1.2

如果将上面的语句改成:

"getNameByUserId" resultType="String"> SELECT name FROM user where id = ${userId}  -- 注意与1.1的对比

当我们输入userId="34;drop table user;"后,打印的语句是这样的:

select name from user where id = 34;drop table user;

mybatis没有使用预编译语句,它会先进行字符串拼接再执行编译,这个过程正是SQL注入生效的过程。

在MyBatis中,“ $ {xxx}”这样格式的参数会直接参与SQL 编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用$ {xxx}“这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。

#{}:相当于JDBC中的PreparedStatement的

$ {}:是输出变量的值

简单说,

# {}是经过预编译的,是安全的 ; 

$ {}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。


http://www.ppmy.cn/news/317804.html

相关文章

SSM项目注解目录(持续更新)

【项目启动相关注解】 SpringBootApplication:启动类注解 ServletComponentScan:作用于启动类上,表明开启过滤支持,与WebFilter注解配合使用,实现过滤器 RestController:ControllerResponseBody注解 Re…

you dont always get all the things in the bag

you dont always get all the things in the bag. 你并不能得到所有你想要的东西。 that you selected from the menu in the delivsry surface. That is life 这就是生活, you get what you get.命里有时终须有,命里无时莫强求 especially if you t…

MCGS洗衣机模拟仿真 组态王洗衣机模拟仿真

MCGS洗衣机模拟仿真 组态王洗衣机模拟仿真 mcgs嵌入式7.7 通用版6.2 三菱西门子plc程序设计 自动洗衣机系统。1250635740803737工控之路永不孤单

贵州工商职业学院寝室图片计算机,贵州工商职业学院宿舍条件怎么样 贵州工商职业学院宿舍图片...

在每年八九月份开学之际,考生最关心的问题之一就是贵州工商职业学院宿舍条件怎么样,寝室环境如何,有没有男生女生宿舍图片可供参考等小编为大家整理了《贵州工商职业学院宿舍条件怎么样》一文,给大家介绍一下贵州工商职业学院宿舍…

5kb大小的云洗衣机HTML源码 朋友圈在线洗衣服

介绍: 空调有了 小电视有了 就差洗衣机了 夏天如约而至,不知道屏幕面前的你是否还在为脏衣服过多而烦恼? 今天他来了! 没错是洗衣机,washing machine直接把衣服丢进去,按下开关即可! 网盘下载地…

云洗衣机HTML5源码 朋友圈在线娱乐洗衣服

介绍: 夏天如约而至,不知道屏幕面前的你是否还在为脏衣服过多而烦恼? 今天他来了! 没错是洗衣机, washing machine 直接把衣服丢进去, 按下开关即可! 网盘下载地址: http://kekewl…

基于微信小程序的宿舍楼洗衣机预约使用管理系统#毕业设计

项目介绍 洗衣服这件小事被当代大学生评为最不幸福的事情,因为国家的政策,大多数大学生都是独生子被父母呵护着、宠爱着很少去碰触一些家务,洗衣服当然是让他们头疼的事情。尽管如今许多高校的寝室楼层都会引进公用洗衣机,多采用…

电器类目主图设计(洗衣机主图)

打开PS,新建一个800*800的画布,将主图素材导入场景中,将文案内容拖动产品中,这个主图使用左右结构。 使用【矩形工具】创建一个矩形,设置【填充】为蓝色,按【CtrlT】调整矩形的形状,添加【渐变叠…