现在很多人使用ORM框架基本上首选都是会选择Mybatis框架,因为相对于Hibernate框架来说,MyBatis框架可以实现程序员自己对于sql的把控以及满足一些复杂查询,但是MyBatis在查询的时候会存在一些查询条件有sql注入的风险。
例如下面这个用户登录的sql语句
select id, username, password from user where username=? and password=?当存在别有用心的人把密码输成1 or 1=1 的话,那么就相当于跳过了这个查询了。所以就需要我们在开发的时候考虑到sql注入的风险。
MyBatis框架中对于查询参数的插入无非就是$和#,其实这2个都特别常用,但是呢 $ 会存在一定的sql注入风险,其实#也会有,但是呢,相对风险就没有$那么高了。
$ 和 #两者的区别在于 使用#{}意味着使用的预编译的语句,即在使用jdbc时的preparedStatement,sql语句中如果存在参数则会使用?作占位符,并且假如传入的是字符串的话,会自动在该参数前后加上单引号,而${}在做字符串查询的时候却于#{} 相反,传递的参数是什么就是什么,如果是字符串的话就需要自己手动加上单引号。
所以#{}能在一定程度上防止sql注入的风险,但是也不能百分百保证,所以当我们需要进行模糊查询的对我们的参数进行一定的转换
MySql 中,就使用 like concat('%', #{name}, '%') 这种方式
Oracle中,就使用 like '%' || #{name} || '%' 这种方式