广州骏域网站建设专家手机电脑版,c2c网站架构,上海企业登记一网通办,1688网文章目录 区别详细讲解${}sql注入案例 区别 #会进行预编译#xff0c;安全#xff0c;通过#{}传入的参数 mybatis会认为是一个字符串#xff0c;自动加上引号“” $ 不会进行预编译#xff0c;通过$ 传入的参数会直接取出来使用#xff0c;可能会产生sql注入风险#xff… 文章目录 区别详细讲解${}sql注入案例 区别 #会进行预编译安全通过#{}传入的参数 mybatis会认为是一个字符串自动加上引号“” $ 不会进行预编译通过$ 传入的参数会直接取出来使用可能会产生sql注入风险只有当传入的是表名时必须用$传入其他的都建议用#{}传入 详细讲解
MyBatis中使用parameterType向SQL语句传参parameterType支持的类型可以是基本类型int,String,HashMap和java自定义类型。 在SQL中引用这些参数的时候可以使用两种方式
#{parameterName}
${parameterName}首先我们说一下这两种引用参数时的区别使用#{parameterName}引用参数的时候Mybatis会把这个参数认为是一个字符串并自动加上引号’ 例如传入参数是“tom”那么在下面SQL中
Select * from user where name #{name}使用的时候就会转换为
Select * from user where name tom; 同时使用${parameterName}的时候在下面SQL中
Select * from user where name ${name}就会直接转换为
Select * from user where name tom简单说#{}是经过预编译的,是安全的。 而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。
#{} 这种取值是编译好SQL语句再取值
${} 这种是取值以后再去编译SQL语句${}sql注入案例
以下用一个示例来看一下$传参sql注入的问题
UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.springboot.store.mapper.UserMapperselect idselectByUsernameselect * from t_user where username ${username}/select
/mapper在单元测试中传入参数如下
Test
public void reg1(){userService.selectByUsername(tom or phone 123);}日志打印sql如下
select * from t_user where username tom or phone 123可以看到我们只是想通过username字段查询但是条件里面却被拼接了phone字段的条件。
接着我们把UserMapper.xml中的$替换为# UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.springboot.store.mapper.UserMapperselect idselectByUsernameselect * from t_user where username ${username}/select
/mapper日志打印sql如下
select * from t_user where username tom or phone 123此时只会根据username条件进行查询。