MyBatis 如何防止SQL注入 —— 底层原理_demo_yo的博客-程序员宅基地_mybatis中防止sql注入的方法和原理

技术标签: 后端框架  mybatis  SQL注入  

一、SQL注入

SQL注入是在Web页面的查询入口传入SQL非法参数,在事先定义好的查询语句的结尾上添加额外的SQL语句,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器执行,威胁数据库数据信息安全。

二、SQL注入方法

由于编写程序时未对用户输入数据的合理性进行判断,导致攻击者能在SQL的注入点中夹杂代码进行执行,并通过页面返回的提示,获取进行下一步攻击所需的信息。根据输入的参数,可将SQL注入方式大致分为两类:数字型注入、字符型注入。

1. 数字型注入

当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

2. 字符型注入

当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。

三、MyBatis如何防止SQL注入

  • “${}”:表示拼接sql串,将接收到的参数的内容不加修饰拼接在sql中,可能引发sql注入。
  • “#{}”是预编译处理,mybatis在处理“#{}”时,它会将sql中的“#{}”替换为占位符“?”,然后调用PreparedStatement的set方法来赋值。
  • “#{}”传入字符串后,会在值的两边加上单引号,使用占位符的方式提高效率,防止sql注入。
1. 防止SQL注入的策略

在UserMapper.xml配置文件中的SQL映射配置:

<select id="findUserByUsername" parameterType="java.lang.String" resultType="cn.com.mybatis.po.User">
	SELECT * FROM user WHERE username=#{
    username} and password=#{
    password}
</select>

MyBatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入。上面代码中使用的“#{}”即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的:

select * from user where username=? and password=?

其实,MyBatis的SQL是一个具有“输入+输出”的功能,类似于函数的结。“#{}”实现了传入参数的占位符,其中,parameterType表示了输入的参数类型,resultType表示了输出的参数类型。回应上文,想防止SQL注入,理所当然地要在输入参数上下功夫。即可利用parameterType限制传入参数的类型。

3、防止SQL注入的底层实现原理

在框架底层,是JDBC中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,它的对象包含了预编译好的SQL语句。这种预编译的方式不仅能提高安全性,而且在多次执行同一个SQL时,能够提高效率。原因是SQL已预编译完成,参入参数直接替换预编译完成的SQL语句中的占位符,执行时无需再编译。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/demo_yo/article/details/114839668

智能推荐

matlab中的abc-dq,关于matlab及pscad中abc2dq模块的使用_铁血中锋郭敬明的博客-程序员宅基地

关于matlab 及pscad 中abc2dq 模块的使用Abc2dq 是电气控制系统中经常需要使用的模块,一般书本中对其的定义如下:0cos cos(2/3)cos(2/3)2sin sin(2/3)sin(2/3)31/21/21/2d a q b c u u u u u u θθπθπθθπθπ-+????????????=----+??????????????????(幅值等价)或0cos...

细数那些互联网公司名字的来历_杨鑫newlfe的博客-程序员宅基地

1、阿里巴巴马云有一次在美国一家餐厅吃饭时,他突发奇想,找来了餐厅服务员,问他是否知道阿里巴巴这个名字。服务员回答说知道,并且还跟马云说阿里巴巴打开宝藏的咒语是“芝麻开门”。之后马云又在各地反复地询问他人,经过这个测试,马云发现阿里巴巴的故事被全世界的人所熟知,并且不论语种,发音也近乎一致。“从我外婆到我儿子,他们都读阿里巴巴。”就这样,一锤定音,马云将“阿里巴巴”确定为公司的名字。

计量经济学——一元线性回归模型(例题)_Master Chicken的博客-程序员宅基地_一元线性回归例题

题目:对一元线性回归模型Yi=β0+β1Xi+μiY_{i}=\beta_{0}+\beta_{1}X_{i}+\mu_{i}Yi​=β0​+β1​Xi​+μi​,试证明Cov(β0^,β1^)=−σ2X‾∑xi2Cov(\widehat{\beta_{0}},\widehat{\beta_{1}})=-\frac{\sigma^2\overline{X}}{\sum{x^2_{i}}}Cov(β0​​,β1​​)=−∑xi2​σ2X​证明:在给定XXX的样本条件下Cov(β0^,β1^)=E[(β0^−

Mybatis延迟加载源码剖析_FYHannnnnn的博客-程序员宅基地

一,什么是Mybatis延迟加载在需要用到数据时才进行加载,不需要用到数据时就不加载数据,延迟加载也称懒加载。二,延迟加载应用应用`要求:每个用户下绑定了很多的订单,在查询返回结果时,调用用户属性获取信息时(不涉及用户下订单信息),用户与订单的联合查询只执行查询用户信息的语句部分。1,局部延迟加载:弊端:需要在每一个调用的ResultMap中去配置。&lt;!-- 开启⼀对多 延迟加载 --&gt;&lt;resultMap id="userMap" type="user

简单双向链表C/C++版_都市流浪猫的博客-程序员宅基地

最近复习算法与数据结构时,看到双向链表,其操作方便,两个指针域方便查找,但是发现很多给出的示例都是循环双向链表,当然比普通双向链表跟有效,但是作为学习之用,也应该了解会写简单的无环双向链表,在网上发掘资料很少,故把自己写的一个简单的程序贴出来供初学者看看,希望大家提意见:/*************************************************************

腾讯传读后感_码农-皮皮蟹的博客-程序员宅基地

转自:http://www.yuwenmi.com/duhougan/72741.html导语:“任何能打破对于人、产品和信息的时空限制的新发展,都会对商业运作的方式产生巨大的影响。”下面是语文迷小编收集整理的关于《腾讯传》的读后感,欢迎大家阅读参考!  这两天,我一直在很认真地看我爱人帮我提前抢购限量版的《腾讯传》。看完之后,它给我的一个感叹便是:

随便推点

大会剧透 | IDEA大会精彩议题全释放_PaperWeekly的博客-程序员宅基地

“2021 IDEA大会将于11月22日-23日在深圳福田四季酒店举行。大会由IDEA创始人、美国国家工程院外籍院士、前微软公司全球执行副总裁沈向洋博士发起,目的是在大湾区搭建一个人工智能...

编程原则_麦兜_冰夕的博客-程序员宅基地_编程的原则

良好的编程原则与良好的设计工程原则密切相关。本文总结的这些设计原则,帮助开发者更有效率的编写代码,并帮助成为一名优秀的程序员。1.避免重复原则(DRY – Don’t repeat yourself)编程的最基本原则是避免重复。在程序代码中总会有很多结构体,如循环、函数、类等等。一旦你重复某个语句或概念,就会很容易形成一个抽象体。12注意:代码的“抽象”和它的“可读性”(直观性),其实是一对矛盾...

C# 变量值溢出和方法值溢出,以及OverflowException异常捕捉和处理_number1killer的博客-程序员宅基地_overflowexception

众所周知如果变量的值越界的话是无法通过编译的,那么是不是只要发生值越界就会无法通过编译呢?很遗憾,编译器虽然聪明,但是还没那么聪明。Visual studio C#编译器只做静态检查,所以在方法中的动态值所导致的值越界编译器是无法在运行之前“检测”到的。将 decimal 值转换为整型类型时,此值会向零舍入到最接近的整数值。 如果生成的整数值处于目标类型的范围之外,则会引发 Overflo...

hdu1518 Square_FBI-PC的博客-程序员宅基地

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518题目为:SquareTime Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7839    Accepted Submi

as3 操作图片,获取,设置实际像素,扣除透明区域_手可摘棉花aa的博客-程序员宅基地

private var a:Loader = new Loader(); private function test():void { a.load(new URLRequest("assets/冷却液管.png")); a.contentLoaderInfo.addEventListener(Event.COMPLETE, an); } private functio

有关京东商城采用.NET架构的社区讨论_iteye_16284的博客-程序员宅基地

最近一段时间,随着双十一、双十二等优惠打折季的过去,有关电商网站的可靠性设计受到国内社区的热烈讨论。在知名问答网站知乎上,有人提出了这样一个问题:“京东今天还在用.NET 架构的原因是什么?”,半年来得到了许多技术圈内人士的回复,其中不乏有意思的内容,对读者朋友很有启发作用。我们简单的对精华回复进行下分类。​观点:历史原因造成陈皓——“我觉得京东用.NET的原因应该很简单:一开...

推荐文章

热门文章

相关标签