MyBatis之#{} and ${}
2024-08-21 15:14:35
#{} 和 ${} 之间最大的差别就是 #{}会在使用的时候被加上 ‘’ 引号, ${}直接传值,不做任何处理
1.#{}对传入的参数会做预编译,也就是会当做字符串来处理
select * from info where name = #{name}
比如传递 博客园,得到的结果就是如下
select * from info where name = '博客园'
2.${}对传入的参数不会做任何的处理,也就是说传递什么就是什么
select * from info where name = ${name]
比如传递 博客园 得到的结果就是如下
select * from info where name = 博客园
3.#{} 最大的好处就是可以很大程度上防止SQL注入(SQL Injection),然而${}则不具备这样的功能
比如我们在做用户登录的场景
使用#{}
select * from user where userCode = #{userCode} and userPwd = #{userPwd}
前台传递:userCode = 123 userPwd = 123 or 1 = 1
后台解析后,MyBatis首先会对SQL语句的参数用 ‘?’做预编译处理
select * from user where userCode = ? and userPwd = ?;
最终效果:
select * from user where userCode = '' and userPwd = '123 or 1 = 1';
这样就可以有效的防止了sql的注入效果 使用${}
select * from user where userCode = ${userCode} and userPwd = ${userPwd}
前台传递:userCode = 123 userPwd = 123 or 1 = 1
后台解析后,MyBatis会直接把值传递给sql,不做任何的处理!
最终效果:
select * from user where userCode = 123 and userPwd = 123 or 1 = 1;
不仅可能导致语法错误!而且更严重的会对导致用户恶意注入sql获取信息,或者做其它恶意操作!!非常危险!
4.说了这么多#{}的好处,好像${}被遗弃的婴儿一样(委屈),但是${}也是有很大作用的!如下:
比如我们在直接想用SQL语句插入一条原封不动的参数的时候,如order by我们的${}就派上用场了()
select * from info order by ${name}
重点:SQL注入是非常可怕的!!!(搞不好被罚工资或者直接牢底坐穿)!一定要注意使用场景!
最新文章
- 如丝般顺滑地从Windows迁移SQLServer数据库到Linux
- Doherty Threshold
- Ubuntu 16.04 安装ftp服务器传输文件
- C# System.Timers.Timer的一些小问题?
- [LINK]Scribe
- EntityFramework.Extended扩展用法
- UITableViewCell 高度自适应
- 提升Delphi编程效率必须使用的快捷键(Delphi2007版本)
- 当KDS晶振遇上爱普生晶振国内生产厂家该如何抉择?
- POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)
- 创建jedis对象
- android的activity栈管理
- .net core EFCore CodeFirst 迁移出现错误【No project was found. Change the current working directory or use the --project option. 】
- hadoop集群的规划和搭建
- 高可用性的负载均衡方案之lvs+keepalived和haproxy+heartbeat区别
- Python二维数组,坑苦了
- 循环神经网络RNN及LSTM
- ASP.NET MVC 阻止通过Url直接访问服务器上的静态文件
- Study 2 —— 图片热点区域
- [BetterExplained]书写是为了更好的思考