sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=’1’”这样的语句,有可能入侵参数校验不足的应用程序。所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式。

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

1
2
3
4
<select id=“getBlogById“ resultType=“Blog“ parameterType=”int”><br data-filtered="filtered">
       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注入呢?当然不是,请看下面的代码:

1
2
3
4
5
<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的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

mybatis如何防止sql注入相关推荐

  1. mybatis能否预防SQL注入

    1.概念:什么是sql注入 SQL注入:是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中. 它一种常见的攻击方式.攻击者在界面的表单信息或者URL上输入一些特殊的S ...

  2. MyBatis 如何防止SQL注入 —— 底层原理

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

  3. MyBatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文授权转载请注明来自FreeBuf.COM 链接:https:/ ...

  4. java持久层框架mybatis如何防止sql注入

    2019独角兽企业重金招聘Python工程师标准>>> sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or ...

  5. Mybatis框架下SQL注入审计分析

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少.新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手, ...

  6. 【MyBatis】防止sql注入

    前言 关于sql注入的解释这里不再赘述. 在MyBatis中防止的sql注入主要分为两种: 第一种就是MyBatis提供了两种支持动态 sql 的语法 #{} 和 ${},其中${} 是简单的字符串替 ...

  7. java mybatis狂神说sql_Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少. 新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手 ...

  8. mybatis中如何防止sql注入和传参

    环境 使用mysql,数据库名为test,含有1表名为users,users内数据如下 JDBC下的SQL注入 在JDBC下有两种方法执行SQL语句,分别是Statement和PrepareState ...

  9. mysql防注入原理_MyBatis如何防止SQL注入

    MyBatis如何防止SQL注入 SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injectio ...

最新文章

  1. 第五周周记(国庆第七天)
  2. 互联网项目开始时需要去谈的产品需求分析:
  3. IT第三阶段?“智慧的运算”的未解之谜
  4. ArrayList的使用
  5. linux导出Excel The maximum column width for an individual cell is 255 characters
  6. Going Deeper in Spiking Neural Networks: VGG and Residual Architectures
  7. 马虎将classname加到了id属性中,造成报错
  8. php 编译安装gd 失败,编译安装php5 解决编译安装的php加载不了gd
  9. 机器学习中的数学基础
  10. Android长图文截图的实现(支持截取微博,知乎,头条等第三方app)
  11. Elasticsearch---Analyzer(分析器)
  12. Android应用内存管理机制
  13. 奇偶校验c语言ascii,奇偶校验(parity check)
  14. 论文翻译(7)---Enriched Long-term Recurrent Convolutional Network for Facial Micro-Expression Recognition
  15. numpy创建国际象棋棋盘的数组
  16. 沪江易未来:沪江网校前端架构漫谈
  17. Incomplete Multimodal Learning(不完整多模态学习)
  18. 汽车MEMS传感器应用及发展
  19. R语言爬取豆瓣图书Top250
  20. 为何华为的5G专利高居第一名,却还被高通要求缴纳专利费?

热门文章

  1. 基于python的毕业论文-基于python的飞机大战小游戏毕业论文设计和代码
  2. java 工作流_【JAVA之工作流介绍】
  3. 原子动作检测 A Better Baseline for AVA
  4. Java蓝桥杯--基础练习(7)特殊回文数
  5. smarty模板基础知识
  6. Android入门:封装一个HTTP请求的辅助类
  7. SRM 578 DIV 2
  8. 打开指定大小的新窗体
  9. yum 安装oraclejdk_kubernetes-16:制作oraclejdk镜像
  10. 10 SystemVerilog语言编写SPI发送