MyBatis中模糊查询防止sql注入的方式

tech2024-10-30  19

      现在很多人使用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} || '%'  这种方式

最新回复(0)