在写公司云平台重构版本的时候遇到#{}和${},随即上网查询了一下两者的区别以及使用方法。
1.Mybatis使用#{}时会将传入的参数自动解析为字符串。例如:elect count(1) from t_user where user_name = #{admin}。此时Mybatis会将其自动转为elect count(1) from t_user where user_name = “admin”。相当于jdbc的预编译,这个方法是安全的。
2.使用${}时,Mybatis不会对参数有任何处理。例如:select count(1) from t_user where user_name = ${admin}。此时,Mybatis生成的语句为select count(1) from t_user where user_name = admin。不会对${}传入的参数做任何处理。
在使用过程中,我们使用#{},而不使用${}。因为使用${}会引起sql注入。
3.什么是sql注入?
SQL注入就是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作。比如说,在
登录过程中,利用上面的语句到数据库中查找用户名/密码是否存在,如果存在就登录成功。而如果不存在就登录
失败,如果说你后台使用的是${},恶意用户在表单中的用户名文本框中输入的是'admin',密码框中输入的是
' ' or 1 = 1 加了一引号和一个恒成立的条件,那么,传到数据库中的sql就是:select count(1) from t_user where
user_name = 'admin' and user_password = ' ' or 1=1。此时,如果程序没有做其他校验的话,该恶意用户是可以
登录系统的! 这就是SQL注入,恶意攻击。
而如果使用#{}是不会出现这种情况的,#{}默认会给输入的值加上引号,但是使用#{}在其他场景下并不适用。比如
要使用到排序 order by #{} 传入的参数应是表对应字段名,但是加上引号后就会解析成order by ‘age’。这样就达不
到排序的目的,而此时如果使用${}就可以达到排序的目的。即,sql解析成order by age,根据age排序。