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的持久层框架(连数 ...
随机推荐
- selenium各种场景下的启动Firefox
开始学习selenium时为了启动Firefox可谓费尽周折,在大神的帮助下才堪堪搞定,走出了selenium的第一步:jdk1.8 + selenium_2.46 + Firefox国际版40.0. ...
- jquery组件团购倒计时功能(转)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- codeforces Vasya and Digital Root
/* * c.cpp * * Created on: 2013-10-7 * Author: wangzhu */ /** * 当时比赛时,想得复杂了,也想偏了, * 1).写出来之后,结果达到了预期 ...
- Android USB Host 通信程序
换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...
- rc522 ,pn544区别
请问 我们之前用的刷卡的 是用 rc522 ,,pn544和这个有什么区别? xqhrs232 (10:14:27): 支持的协议更多点吧! 春tian在哪里 (10:14:38): 比如? xq ...
- 坑爹的libxml2 for mingw 编译 (二)
makefile 中由于大量使用了cmd /C ""样式去执行mkdir和copy操作,导致mingw最后出错,因为会从mingw切换至cmd界面.因此需要把相关代码进行修改. # ...
- IPv6 tutorial – Part 7: Zone ID and unique local IPv6 unicast addresses
The zone ID is used to distinguish ambiguous link-local and site-local addresses. Unique local IPv6 ...
- Oracle系列之序列
涉及到表的处理请参看原表结构与数据 Oracle建表插数据等等 语法结构:创建序列 create sequence sequence_name start with num increment by ...
- Oracle备忘录
习惯是一个数据库中有多个用户,但是一个用户对应一个系统 数据库管理员主要职责: 每个Oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库 ...
- MVC——母版与分部
背景: 母版是因为有一些网站里的很多网页都是采用相同的布局,所以只需要写一个母版,然后在母版该写不同模板的地方加上@RenderBody(),然后创建不同模块的时候只需要创建视图,然后选择母版就可以了 ...