Mybatis中#{}与${}的区别
#{}
#{}
表示一个占位符“?
”,采用preparedStatement给占位符设置值,自动进行java类型和jdbc类型转换,进行预编译处理,#{}可以有效防止sql注入(预编译是提前对SQL语句进行编译,而其后注入的参数将不会再进行编译)
${}
${}
表示字符串替换,通过${}可以将parameterType或实体,传入的内容拼接在sql中且不进行jdbc类型转换
代码示例
select * from user where user_name = #{userName} and user_password = #{password}
使用#{}时,会进行jdbc类型转换,根据属性 自动加上单引号
select * from user where user_name = 'admin' and user_password = '123456';
select * from user where user_name = ${userName} and user_password = ${password}
而${}
不会进行jdbc类型
转换,只是简单的字符串替换,不会加上单引号,会有sql注入的风险
select * from user where user_name = admin and user_password = 123456;
SQL注入举例说明
SQL注入
就是利用现有应用程序,将(恶意)的SQL命令
注入到后台数据库执行一些恶意的操作。比如说:在登录过程中,利用上面的语句到数据库中查找用户名/密码是否存在,如果存在就登录成功,如果不存在就登录失败。
若使用${}
,恶意用户在表单中的用户名文本框中输入的是'admin'
,
密码框中输入的是 ' ' or 1 = 1
加了单引号引号和一个恒成立的条件,那么,传到数据库中的sql就是:
select * from user where user_name = 'admin' and user_password = ' ' or 1=1
登录成功,该恶意用户是可以登录系统的! 这就是SQL注入
,恶意攻击
而如果使用#{}
是不会出现这种情况的,#{}
默认会给输入的值加上引号,密码错误,登录失败:
//sql错误
select * from user where user_name = ''admin'' and user_password ='' '' or 1=1'
标签:name,区别,user,SQL,Mybatis,password,where,select
From: https://www.cnblogs.com/xiaopiao/p/16839425.html