前言略,直奔主题..

#{}相当于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注入问题相关推荐

  1. mybatis中#{}和${}的区别及order by的sql注入问题

    mybatis的#{}和${}的区别以及order by注入问题 原文  http://www.cnblogs.com/chyu/p/4389701.html 前言略,直奔主题.. #{}相当于jdb ...

  2. mybatis select语句会默认带排序吗_MyBatis中#和$的区别详解

    区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111& ...

  3. java中$和 的区别详解_MyBatis中#{}和${}的区别详解

    区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111& ...

  4. mysql批量用trim限定_mybatis中批量更新sql语句,trim、foreach标签,varchar定义理解

    准备工作 现在有一张表为:student,相关字段如下: mapper层方法 int batchUpdateStudent(List studentList); xml语句 update studen ...

  5. SQL Server 2019中的证书管理

    介绍 (Introduction) Certificate Management in SQL Server 2019 has been enhanced a lot when compared wi ...

  6. sql查询禁用缓存_如何在SQL Server 2017中启用和禁用身份缓存

    sql查询禁用缓存 Every data warehouse developer is likely to appreciate the significance of having surrogat ...

  7. SQL截断增强功能:SQL Server 2019中的静默数据截断

    In this article, we'll take a look into SQL truncate improvement in SQL Server 2019. 在本文中,我们将研究SQL S ...

  8. 在SQL Server 2017中使用Python进行数据插值和转换

    As a continuation to my previous article, How to use Python in SQL Server 2017 to obtain advanced da ...

  9. SQL错误提示档案(3):SQL Server连接中的四个最常见错误

    SQL   Server连接中的四个最常见错误:         一."SQL   Server   不存在或访问被拒绝"          一般说来,有以下几种可能性:     ...

最新文章

  1. Mysql—(1)—
  2. 转元组 python_Python基础教程,第三讲,列表和元组
  3. 《复盘+》把经验转化为能力
  4. java sqlite3查询慢_java连接数据库进行查询优化跑不通谁能帮我调下通
  5. 飞康CEO:敢于向传统的灾备法则说“不”
  6. 训练Tesseract
  7. Java标识符和关键字(static,final,abstract,interface)
  8. 教我兄弟学Android逆向
  9. python selenium加速_selenium2.0环境搭建(一)
  10. leftjoin数据量变多_你知道 Sql 中 left join 的底层原理吗?
  11. 笔记| 计算机数据表示实验(HUST)| 汉字机内码获取实验
  12. Tbschedule参数配置理解
  13. excel几个数相加等于某个数_『excel表如何从一列数据中筛选出合计等于某数的某些数?』...
  14. roundcube db.inc.php,Roundcube Webmail 安装配置篇
  15. Html+JavaScript猜数字游戏
  16. word在试图打开文件时遇到错误,解决办法
  17. 迁移操作系统:如何把系统迁移到固态硬盘SSD?
  18. jetson nano 5 运行YOLOV5
  19. 大括号内打两行公式,还附带标号或条件
  20. 面向对象:余愿,知你冷暖,懂你悲欢,与你共黄昏,也能问你粥可温

热门文章

  1. SAP Spartacus的site context配置参数SiteContextParamsService
  2. Angular应用带参数的路由实现
  3. 在中国使用pip更新或安装库的配置
  4. 如何关闭Windows10任务栏上的输入法提示图标
  5. SAP ABAP SM50事务码和Hybris Commerce的线程管理器
  6. SAP OData Batch request processing in backend
  7. 关于SAP Spartacus添加缺失的cost center route配置的必要性
  8. replication debug for PRODUCT_MAT
  9. settype where used list - set type where use list - equipment download environme
  10. How is default text type determined for Account view