mybatis的$存在安全问题,为什么又不得不用?
1、mybatis的官网关于$和#的字符串替换符号区别描述如下:
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Parameters

上面的意思是说:假如参数columnName的值是ID,那么${columnName}会变成ID,#{columnName}会被替换成'ID',变成了字符串,注意引号。
2、对于上面的描述谈下自己的理解:
假如你使用符号#,那么输入的参数会被看做字符串,假如你输入参数ID,最后就会变成字符串'ID';
假如上面的的参数ID表示数据表的列名,你想根据这一列进行排序,你所期望的sql语句大概是这样:select * from tb_name order by ID,可是,你使用#符号,在xxxMapper.xml中写成下列模式:
<select id="queryByParams" parameterType="MyTestDO" resultMap="MyTestMap">
SELECT * FROM tb_name order by #{ID}
</select>
最终生成的sql语句其实是这个样子:select * from tb_name order by 'ID',这样就无法实现根据列名ID进行排序的目的,因为没有列名'ID',只有列名ID,但是sql语法没有问题,可以执行。
对于这种情况,为了防止sql注入问题,我们只能限制传入的参数内容或者形式,不能让任意的参数内容传入进来。比如下面的代码:
String orderByType=request.getParameter(ORDER_BY_TYPE);
if(StringUtils.isNotEmpty(orderByType)){
if(orderByType.equals("desc")||orderByType.equals("asc")){
sqlParamFromRequest(sqlParams, ORDER_BY_TYPE);
}
} String orderparam=request.getParameter("orderParam");
if(StringUtils.isNotEmpty(orderparam)) { if (orderparam.equals("normal_counting+abnormal_counting")) {
sqlParams.put("orderParam", "addnew"); } else if(orderparam.equals("normal_counting")||orderparam.equals("abnormal_counting")||orderparam.equals("emulator_counting")||orderparam.equals("app_channel")){ sqlParamFromRequest(sqlParams, ORDER_BY_PARME);
}
}
3、有些资料说like不能使用#符号,我实际测试,是可以用的
对于下面需要使用拼接的情况,是可以使用#符号的,像下面写的这样:
<select id="queryByParams" parameterType="MyTestDO" resultMap="MyTestMap">
SELECT * FROM tb_shen
WHERE 1=1
<if test="name !=null">AND name LIKE CONCAT('%',#{name},'%')</if>
</select>
实际测试情况如下:(和上面的例子sql不符,因为这是后面修改的)

但是如果你写成下面的样子,在mybatis预处理的时候,是有问题的
<select id="queryByParams" parameterType="MyTestDO" resultMap="MyTestMap">
SELECT * FROM tb_shen
WHERE 1=1
<if test="name !=null">AND name LIKE CONCAT('%','#{name}','%')</if>
</select>


mybatis的$存在安全问题,为什么又不得不用?的更多相关文章
- [MyBatis]DAO层只写接口,不用写实现类
团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...
- mybatis隐藏不用的sql
在mybatis的xml中,选中了不用的sql语句,使用ctrl + shift + / 隐去,,结果是 <where> <if test="dto.startTime ! ...
- 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建 前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Sp ...
- spring与MyBatis结合
下面将介绍使用spring+mybatis的开发样例: 首先,笔者创建的是一个maven工程,在开发先先导入相关的依赖jar: pom.xml: <dependencies> <de ...
- hibernate和mybatis
本来是个菜鸟程序员,现在大学还没毕业. 最近一直在想一个问题,到底是hibernate好还是mybatis好.我总觉得 hibernate好用之极,在大学里做过的小项目都是用的hibernate,只要 ...
- MyBatis 3 User Guide Simplified Chinese.pdf
MyBatis 3 用户指南 帮助我们把文档做得更好… 如果你发现了本文档的遗漏之处,或者丢失 MyBatis 特性的说明时,那么最好的方法就 是了解一下这个遗漏之处然后把它记录下来. 我们在 wik ...
- MyBatis 查询映射自定义枚举
背景 MyBatis查询若想映射枚举类型,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用 ...
- java框架之mybatis
一.简介 1.基本概念 mybatis 是一个半自动轻量级的一个 orm 框架 将 java 与 sql 分离,解决了 jdbc 的硬编码问题: sql 由开发人员控制,更加方便 sql 的修改调优: ...
- 框架MyBatis
ByBatis MyBatis是Apache的一个开源项目iBatis,iBatis3.x 正式更名为MyBatis ,代码于2013年11月迁移到Github.它是一个基于Java的持久层框架(连数 ...
随机推荐
- java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)(ERR=12505)(ERR
dbc 链接orcal出错 java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)( ...
- Ubuntu下将Sublime Text设置为默认编辑器
转自将Sublime Text 2设置为默认编辑器 修改defaults.list 编辑/etc/gnome/default.list文件,将其中的所有gedit.desktop替换为sublime_ ...
- Java 编程:如何提高性能?(简单总结篇)
开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作系 ...
- RPM包制作最简单样例
相关开发RPM的包要安装 Summary: the Firt RPM of Sky Name: hellow Version: 0.1 Release: Vendor: PA soft(aguncn@ ...
- maven 依赖排除
在项目中遇到一个问题,项目使用spring 3.x,引用了某些包,这些包又依赖了spring2.x,造成项目无法启动.这种情况就需要用到maven的依赖排除,配置如下: 使用以下代码排除依赖xxxx引 ...
- Linux使用wake_up_interruptible()唤醒注册到等待队列上的进程
http://blog.sina.com.cn/s/blog_4770ef020101h48l.html 功能:唤醒注册到等待队列上的进程 原型: #include void ...
- C# Json处理日期和Table
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ru ...
- crtmpserver系列之一:流媒体概述
阅读目录 概述 流媒体系统的组成 媒体文件封装 传输协议 回到顶部 概述 所谓流媒体按照字面意思理解就是像流一样的媒体,看起来像是废话.流媒体现在司空见惯,所以一般人大概不会有疑问.事实上在流媒体还没 ...
- Markdown简单语法总结
. 标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 2. 列表 无序列表 * 西瓜 * 葡萄 * 香蕉 - 西瓜 - 葡萄 - ...
- Linux伙伴系统1
(一)--伙伴系统的概述 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生.Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先 ...