Loading

Mybatis中#{}与${}的区别

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'
posted @ 2022-10-29 19:08  xiaopiao  阅读(79)  评论(0编辑  收藏  举报