sql注入代码:
//sql注入
public User login(User user);
<select id="login" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">
select * from user where username = '${username}' and password = '${password}'
</select>
<select id="login" parameterType="com.zh.pojo.User" resultType="com.zh.pojo.User">
select * from user where username=#{username} and password=#{password}
</select>
@Test
public void testLogin(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User userInfo = new User();
userInfo.setUsername('xxx' #");
userInfo.setPassword("123");
User user = userDao.login(userInfo);
System.out.println(user);
}
#{} 和${}的区别:
#{}符
-
#{}表示一个占位符号 通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换
-
#{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类 型值,#{}括号中可以是 value 或其它名称。
-
#{}可以有效防止 sql 注入。
${}符
-
${}表示拼接 sql 串 通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换
-
${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value
结论:
1.${}不防止SQL注入 #{}可以防止SQL注入 2.除了模糊匹配外,尽量不使用使用${}