mysql order by sql注入_mybatis中#{}和${}的区别及order by的sql注入问题
前言略,直奔主题..
#{}相当于jdbc中的preparedstatement
${}是输出变量的值
简单的说就是#{}传过来的参数带单引号'',而${}传过来的参数不带单引号。
你可能说不明所以,不要紧我们看2段代码:
String sql = "select * from admin_domain_location order by ?";
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, "domain_id");
System.out.println(st.toString());
ResultSet rs = st.executeQuery();
while(rs.next()){
System.out.println(rs.getString("domain_id"));
}
输出结果:
com.mysql.jdbc.PreparedStatement@1fa1ba1: select * from admin_domain_location order by 'domain_id'
3
4
5
2
6
这是个jdbc的preparedstatement例子,不要吐槽我这么写是否合法,这里只是为了说明问题.
以上例子有得出以下信息: 1) order by后面如果采用预编译的形式动态输入参数,那么实际插入的参数是一个字符串,例子中是:order by 'domain_id'
2)输出结果并没有排序,从sql语句中的形式我们也可以推测出此sql语句根本也不合法(正常应该是 order by domain_id )
修改以上代码如下:
String input = "domain_id";
String sql = "select * from admin_domain_location order by "+input;
PreparedStatement st = con.prepareStatement(sql);
System.out.println(st.toString());
ResultSet rs = st.executeQuery();
while(rs.next()){
System.out.println(rs.getString("domain_id"));
}
输出结果:
com.mysql.jdbc.PreparedStatement@1fa1ba1: select * from admin_domain_location order by domain_id
2
3
4
5
6
此次我们直接把一个变量的值拼接sql语句,从结果可以看出来:
1)sql语句拼接正常
2)查询结果排序正常
你可能要问这和#{}与${}有什么关系..
上面已经说过#{}相当于jdbc的preparedstatement,所以以上的第一个例子就相当于#{},那么第二个例子就自然而然指的是${}的情况.
你可能说思维还是有些凌乱,不要紧我们来看第三个例子:
String sql = "select * from admin_domain_location where domain_id=?";
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, "2");
System.out.println(st.toString());
ResultSet rs = st.executeQuery();
while(rs.next()){
System.out.println(rs.getString("domain_id"));
}
=======================================
String input = "2";
String sql = "select * from admin_domain_location where domain_id='"+input+"'";
PreparedStatement st = con.prepareStatement(sql);
System.out.println(st.toString());
ResultSet rs = st.executeQuery();
while(rs.next()){
System.out.println(rs.getString("domain_id"));
}
输出结果都为:
com.mysql.jdbc.PreparedStatement@12bf560: select * from admin_domain_location where domain_id='2'
2
这第三个例子虽然说的是#{}和${}通用的问题,也就是说在此种情况下#{}和${}是通用的,只不过需要些小的转换.如例子中需要手动
拼接单引号 ' ' 到变量值的前后,确保sql语句正常.
简单说#{}是经过预编译的,是安全的,而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在sql注入.
这里先说一下只能${}的情况,从我们前面的例子中也能看出,order by是肯定只能用${}了,用#{}会多个' '导致sql语句失效.此外还有一个like 语句后也需要用${},简单想一下
就能明白.由于${}仅仅是简单的取值,所以以前sql注入的方法适用此处,如果我们order by语句后用了${},那么不做任何处理的时候是存在sql注入危险的.你说怎么防止,那我只
能悲惨的告诉你,你得手动处理过滤一下输入的内容,如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确写查询一下输入的参数是否在预期的参数集合中..
mysql order by sql注入_mybatis中#{}和${}的区别及order by的sql注入问题相关推荐
- mybatis中#{}和${}的区别及order by的sql注入问题
mybatis的#{}和${}的区别以及order by注入问题 原文 http://www.cnblogs.com/chyu/p/4389701.html 前言略,直奔主题.. #{}相当于jdb ...
- mybatis select语句会默认带排序吗_MyBatis中#和$的区别详解
区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111& ...
- java中$和 的区别详解_MyBatis中#{}和${}的区别详解
区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111& ...
- mysql批量用trim限定_mybatis中批量更新sql语句,trim、foreach标签,varchar定义理解
准备工作 现在有一张表为:student,相关字段如下: mapper层方法 int batchUpdateStudent(List studentList); xml语句 update studen ...
- SQL Server 2019中的证书管理
介绍 (Introduction) Certificate Management in SQL Server 2019 has been enhanced a lot when compared wi ...
- sql查询禁用缓存_如何在SQL Server 2017中启用和禁用身份缓存
sql查询禁用缓存 Every data warehouse developer is likely to appreciate the significance of having surrogat ...
- SQL截断增强功能:SQL Server 2019中的静默数据截断
In this article, we'll take a look into SQL truncate improvement in SQL Server 2019. 在本文中,我们将研究SQL S ...
- 在SQL Server 2017中使用Python进行数据插值和转换
As a continuation to my previous article, How to use Python in SQL Server 2017 to obtain advanced da ...
- SQL错误提示档案(3):SQL Server连接中的四个最常见错误
SQL Server连接中的四个最常见错误: 一."SQL Server 不存在或访问被拒绝" 一般说来,有以下几种可能性: ...
最新文章
- Mysql—(1)—
- 转元组 python_Python基础教程,第三讲,列表和元组
- 《复盘+》把经验转化为能力
- java sqlite3查询慢_java连接数据库进行查询优化跑不通谁能帮我调下通
- 飞康CEO:敢于向传统的灾备法则说“不”
- 训练Tesseract
- Java标识符和关键字(static,final,abstract,interface)
- 教我兄弟学Android逆向
- python selenium加速_selenium2.0环境搭建(一)
- leftjoin数据量变多_你知道 Sql 中 left join 的底层原理吗?
- 笔记| 计算机数据表示实验(HUST)| 汉字机内码获取实验
- Tbschedule参数配置理解
- excel几个数相加等于某个数_『excel表如何从一列数据中筛选出合计等于某数的某些数?』...
- roundcube db.inc.php,Roundcube Webmail 安装配置篇
- Html+JavaScript猜数字游戏
- word在试图打开文件时遇到错误,解决办法
- 迁移操作系统:如何把系统迁移到固态硬盘SSD?
- jetson nano 5 运行YOLOV5
- 大括号内打两行公式,还附带标号或条件
- 面向对象:余愿,知你冷暖,懂你悲欢,与你共黄昏,也能问你粥可温
热门文章
- SAP Spartacus的site context配置参数SiteContextParamsService
- Angular应用带参数的路由实现
- 在中国使用pip更新或安装库的配置
- 如何关闭Windows10任务栏上的输入法提示图标
- SAP ABAP SM50事务码和Hybris Commerce的线程管理器
- SAP OData Batch request processing in backend
- 关于SAP Spartacus添加缺失的cost center route配置的必要性
- replication debug for PRODUCT_MAT
- settype where used list - set type where use list - equipment download environme
- How is default text type determined for Account view