程序员自己做网站赚钱,男人网址你懂我意思正能量,wordpress搭建表格,地推项目对接平台目录
MyBatis传参占位符区别
不能直接用#{}的情况
in多参数值查询
like %%模糊查询
order by列名参数化 MyBatis传参占位符区别
在 MyBatis 中#xff0c;#{} 和 ${} 都是用于传参的占位符#xff0c;但它们之间有很大的区别#xff0c;主要体现在两个方面#xff1a…目录
MyBatis传参占位符区别
不能直接用#{}的情况
in多参数值查询
like %%模糊查询
order by列名参数化 MyBatis传参占位符区别
在 MyBatis 中#{} 和 ${} 都是用于传参的占位符但它们之间有很大的区别主要体现在两个方面参数值的类型和 SQL 注入问题。
1.参数值的类型 ① #{} 是预编译参数表示使用 PreparedStatement 时使用 setXXX() 方法设置参数值会对传入的参数进行类型处理确保传递的参数类型正确。一般来说我们在使用 MyBatis 进行 CRUD 操作时都应该使用 #{} 来传递参数这样可以有效地避免 SQL 注入问题。 ② ${} 是字符串拼接表示在 SQL 语句中直接插入传入的参数值不会对传入的参数类型进行处理。如果传入的参数是字符串类型那么在 SQL 语句中使用时需要使用单引号将其括起来否则会抛出 SQL 语法错误异常。因此在使用 ${} 时需要特别注意避免 SQL 注入问题。
简而言之
如果传入Z3r4y
# PrepareStatement ? 填充参数 类型化 转义处理 返回一个Z3r\4y
$ Statement 拼接参数 返回一个Z3r4y 2.SQL 注入问题 ① #{} 可以避免 SQL 注入问题因为它会对传入的参数进行类型处理并将参数值转义后再放到 SQL 语句中保证了 SQL 语句的安全性。 ② ${} 存在 SQL 注入问题因为 SQL 语句中插入的是传入的参数值如果参数值中包含 SQL 语句的关键字或特殊字符可能会导致 SQL 注入攻击。
举个例子
!-- 使用#不存在漏洞默认都是PREPARED--select idfindUserById resultTypecom.example.mybaits.entity.User statementTypePREPAREDSELECT * FROM tbuser where id #{id}/select!-- 使用$存在注入漏洞 --select idfindUserByName resultTypecom.example.mybaits.entity.UserSELECT * FROM tbuser where userName${username}/select
总结一下原则就是能用#{}就不要用${} 不能直接用#{}的情况
因为一些sql语言的性质一些情况不能直接用#{}传参强制被引号包裹导致sql语义错误
比如下面这种情况
如果直接SELECT * FROM tbuser where id in (#{ids})并传参ids1,2,3就会拼接成
SELECT * FROM tbuser where id in (1,2,3);
从而出现只调出一行的谬误 解决方案如下
in多参数值查询 !-- in查询错误写法 --select idfindUserInIds resultTypecom.example.mybaits.entity.User SELECT * FROM tbuser where id in (${ids})/select!-- in查询正确写法 --select idfindUserInIdsRight resultTypecom.example.mybaits.entity.User SELECT * FROM tbuser where id inforeach collectionlist itemids open( close) separator,#{ids}/foreach/select
like %%模糊查询 !-- 模糊查询错误写法 --select idfindUserLikeName resultTypecom.example.mybaits.entity.UserSELECT * FROM tbuser where userName like %${username}%/select!-- 模糊查询正确写法 --select idfindUserLikeName resultTypecom.example.mybaits.entity.UserSELECT * FROM tbuser where userName like concat(%,#{username}, %)/select order by列名参数化
!--动态指定列名排序,有注入漏洞--select idallUserSeq resultTypecom.example.mybaits.entity.UserSELECT *FROM tbuser order by ${colName}
/select
基于MyBatis并不能很好解决这种注入漏洞