广告
返回顶部
首页 > 资讯 > 精选 >Mybatis防止sql注入原理是什么
  • 378
分享到

Mybatis防止sql注入原理是什么

2023-06-22 02:06:11 378人浏览 安东尼
摘要

这篇文章主要讲解了“mybatis防止sql注入原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis防止sql注入原理是什么”吧!Mybatis防止sql注入原理SQL 注

这篇文章主要讲解了“mybatis防止sql注入原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis防止sql注入原理是什么”吧!

Mybatis防止sql注入原理

SQL 注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL 语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者)。[摘自] SQL注入 - 维基百科SQL注入,大家都不陌生,是一种常见的攻击方式。攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“或'1'='1'”这样的语句),有可能入侵参数检验不足的应用程序。所以,在我们的应用中需要做一些,来防备这样的攻击方式。在一些安全性要求很高的应用(比如银行软件),经常使用将 SQL 语句全部替换为存储过程这样的方式,来防止SQL注入。当然这的英文一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式。

MyBatis的框架作为一款半自动化ORM框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL 注入。其实,MyBatis的SQL的是一个具有“ 输入+ 输出 ”的功能,类似于函数的结构,如下:

<select id =“ getBlogById ”resultType =“ Blog ”parameterType =“ int ”>         SELECT id,title,author,contentFROM blogWHERE id =#{id}</select>

这里,参数类型表示了输入的参数类型,与resultType表示了输出的参数类型,回应上文,如果我们想防止SQL注入,理所当然地要在输入参数上下功夫。上面代码中黄色高亮即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的:

SELECT id,title,author,content FROM blog WHERE id =?

不管输入什么参数,打印出的SQL都是这样的这是因为MyBatis的启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL ,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。

底层实现原理

其原因就是:采用了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已编译好,再次执行时无需再编译。

话说回来,是否我们使用的MyBatis就一定可以防止SQL注入呢当然不是,请看下面的代码?

<select id =“ getBlogById ”resultType =“ Blog ”parameterType =“ int ”>         SELECT id,title,author,content         FROM blogWHERE id = $ {id}</select>

仔细观察,内联参数的格式由“ {xxx}”变为了“ $ {xxx}”。如果我们给参数“ id ”赋值为“ 3 ”,将SQL打印出来是这样的:

SELECT id,title,author,content FROM blog WHERE id = 3

(上面的对比示例是我自己添加的,为了与前面的示例形成鲜明的对比。)

<select id =“ orderBlog ”resultType =“ Blog ”parameterType =“ map ”>         SELECT id,title,author,content           FROM bloGoRDER BY $ {orderParam}</select>

仔细观察,内联参数的格式由“ {xxx}”变为了“ $ {xxx}”。如果我们给参数“ orderParam ”赋值为“ id ”,将SQL打印出来是这样的:

SELECT id,title,author,content FROM blog ORDER BY id

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

【结论】在编写MyBatis的映射语句时,尽量采用“ {xxx}”这样的格式。若不得不使用“ $ {xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

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

  • $ {}:是输出变量的值

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

如果我们通过语句后用了订单$ {},那么不做任何处理的时候是存在SQL注入危险的。你说怎么防止,那我只能悲惨的告诉你,你得手动处理过滤一下输入的内容。如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确的过滤则可以查询一下输入侧的参数是否在预期的参数集合中。

Mybatis解决sql注入问题

sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1'='1'”这样的语句,有可能入侵参数校验不足的应用程序。

所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式。

mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。其实Mybatis的sql是一个具有“输入+输出”功能,类似于函数的结构,如下:

<select id=“getBlogById“ resultType=“Blog“ parameterType=”int”><br>       select id,title,author,content from blog where id=#{id}</select>

这里,parameterType标示了输入的参数类型,resultType标示了输出的参数类型。回应上文,如果我们想防止sql注入,理所当然地要在输入参数上下功夫。上面代码中高亮部分即输入参数在sql中拼接的部分,传入参数后,打印出执行的sql语句,会看到sql是这样的:

select id,title,author,content from blog where id = ?

不管输入什么参数,打印出的sql都是这样的。这是因为mybatis启用了预编译功能,在sql执行前,会先将上面的sql发送给数据库进行编译,执行时,直接使用编译好的sql,替换占位符“?”就可以了。因为sql注入只能对编译过程起作用,所以这样的方式就很好地避免了sql注入的问题。

mybatis是如何做到sql预编译的呢?其实在框架底层,是jdbc中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,它的对象包含了编译好的sql语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行一个sql时,能够提高效率,原因是sql已编译好,再次执行时无需再编译。

话说回来,是否我们使用mybatis就一定可以防止sql注入呢?当然不是,请看下面的代码:

<select id=“orderBlog“ resultType=“Blog“ parameterType=”map”>       select id,title,author,content from blog order by ${orderParam}</select>

仔细观察,内联参数的格式由“#{xxx}”变为了${xxx}。如果我们给参数“orderParam”赋值为”id”,将sql打印出来,是这样的:

select id,title,author,content from blog order by id

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

感谢各位的阅读,以上就是“Mybatis防止sql注入原理是什么”的内容了,经过本文的学习后,相信大家对Mybatis防止sql注入原理是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Mybatis防止sql注入原理是什么

本文链接: https://www.lsjlt.com/news/301925.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mybatis防止sql注入原理是什么
    这篇文章主要讲解了“Mybatis防止sql注入原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis防止sql注入原理是什么”吧!Mybatis防止sql注入原理SQL 注...
    99+
    2023-06-22
  • Mybatis防止sql注入原理分析
    目录Mybatis防止sql注入原理底层实现原理Mybatis解决sql注入问题小结一下Mybatis防止sql注入原理 SQL 注入是一种代码注入技术,用于攻击数据驱动的应用,恶意...
    99+
    2022-11-12
  • mybatis是如何防止SQL注入的
    mybatis防止SQL注入的方法:mybatis在框架底层,是JDBC中的PreparedStatement类在起作用,因此mybatis启用了预编译功能,从而降低了SQL注入的风险,例如://安全的,预编译了的Connection co...
    99+
    2022-10-12
  • Mybatis是这样防止sql注入的
    目录1、首先看一下下面两个sql语句的区别:2、什么是sql注入3、mybatis是如何做到防止sql注入的4、参考文章1、首先看一下下面两个sql语句的区别: <sele...
    99+
    2022-11-12
  • Mybatis-plus sql注入及防止sql注入详解
    目录一、SQL注入是什么?二、mybatis是如何做到防止sql注入的1. #{} 和 ${} 两者的区别2.PreparedStatement和Statement的区别3.什么是预...
    99+
    2022-11-13
    mybatis-plus sql注入 mybatis-plus防止sql注入
  • mybatis是如何防止SQL注入的(转)
    #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。 如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username="111", 如果传...
    99+
    2019-09-24
    mybatis是如何防止SQL注入的(转)
  • MyBatis中防止SQL注入讲解
    SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者)。 SQL注入,大家都不陌生,是一种常见的攻击方式。...
    99+
    2022-11-12
  • Mybatis防止sql注入的实例
    sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1'='1'”这样的语句,有可能入侵参数校验不足的应用程序。所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些...
    99+
    2023-05-31
    mybatis sql 注入
  • mybatis动态表名怎么防止SQL注入
    要防止 MyBatis 中的 SQL 注入,可以通过以下方式来动态构建表名:1. 在 Mapper 接口中使用 @Param 注解传...
    99+
    2023-09-29
    mybatis SQL
  • SQL参数化查询能防止SQL注入的原因是什么
    这篇文章主要介绍了SQL参数化查询能防止SQL注入的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL参数化查询能防止SQL注入的原因是什么文章都会有所收获,下面我...
    99+
    2023-03-20
    sql
  • mybatis模糊查询如何防止sql注入
    mybatis模糊查询防止sql注入的方法:bind + #{}模糊查询可以防止SQL注入,bind元素可以从OGNL表达式中创建一个变量并将其绑定到上下文,例如:<select id="selectBl...
    99+
    2022-10-23
  • SQL注入与防止及MyBatis基本作用
    目录SQL注入防止SQL注入的方法mybaits中${}和#{}的使用SQL注入 在嵌入式SQL编程中,sql语句通常是以字符串的形式提交给数据库管理系统的。SQL注入是利用SQL语...
    99+
    2022-11-12
  • 实例讲解MyBatis如何防止SQL注入
     SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。究其原因不外乎:No patch for stupid。为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样...
    99+
    2022-11-12
  • 怎么防止SQL注入
    这篇文章主要介绍了怎么防止SQL注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL注入即是指web应用程序对用户输入数据的合法性没有判...
    99+
    2022-10-18
  • preparestatement是怎么防止sql注入的
    preparestatement防止sql注入的方法:当使用PreprareStatement时,即使参数里有敏感字符如or '1=1',数据库也会作为一个参数一个字段的属性值来处理,而不会作为一个SQL指令来执行,用法示例:String ...
    99+
    2022-10-13
  • golang怎么防止sql注入
    在Go语言中,可以使用参数化查询或预编译语句来防止SQL注入。1. 参数化查询:使用占位符来代替实际的参数值,然后将参数值作为参数传...
    99+
    2023-09-17
    golang sql
  • ibatis怎么防止sql注入
    ibatis防止sql注入的方法:使用#写法采用预编译方式,将转义交给数据库,则不会出现注入问题,例如://mysql环境select * from test where school_name like conca&#...
    99+
    2022-10-10
  • hibernate怎么防止sql注入
    hibernate防止sql注入的方法:使用named parameter方法(在查询字符串中使用:),例如:usernameString//前台输入的用户名passwordString//前台输入的密码//hql语句String quer...
    99+
    2022-10-20
  • laravel怎么防止sql注入
    这篇文章主要介绍“laravel怎么防止sql注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel怎么防止sql注入”文章能帮助大家解决问题。当你使用Eloquent查询时,如:User...
    99+
    2023-07-04
  • mysql怎么防止sql注入
    要防止SQL注入,可以采取以下措施:1. 使用参数化查询或预编译语句:通过将用户输入的值作为参数传递给查询语句,而不是将其直接拼接到...
    99+
    2023-08-23
    mysql sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作