一、什么是SQL注入
SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的
作。
造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码
SQL注入防攻击手段
不要使用拼接SQL语句方式、最好使用预编译方式,在mybatis编写sql语句的时候
最好使用#传参数方式,不要使用$传参数,
因为$传参数方式,可能会受到sql语句攻击。
二、MyBatis #与?区别
#{}
解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符,可以防止SQL注入问题。
${}
仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
三、演示案例:
正常传递参数:
http://127.0.0.1:8080/login?userName=‘liusi’&password=‘123’
传递攻击参数 or 1=1 ,如果使用$ ,sql 会把 or 1=1 也拼接进去,导致能查询出所有数据
http://127.0.0.1:8080/login?userName=‘liusi’&password=‘123’ or 1=1
@RestController
public class LoginController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/login")
public String login(UserEntity userEntity) {
System.out.println("账号密码信息:userEntity:" + userEntity.toString());
UserEntity login = userMapper.login(userEntity);
return login == null ? "登陆失败!" : "登陆成功!";
}
}
public interface UserMapper {
@Select(" SELECT * FROM user_info where userName=${userName} and password=${password}")
public UserEntity login(UserEntity userEntity);
}