主题
预编译SQL
SQL注入是因为解释器将传入的数据当成命令执行而导致的,预编译是用于解决这个问题的一种方法。和普通的执行流程不同,预编译将一次查询通过两次交互完成,第一次交互发送查询语句的模板,由后端的SQL引擎进行解析为AST或Opcode,第二次交互发送数据,代入AST或Opcode中执行。因为此时语法解析已经完成,所以不会再出现混淆数据和代码的过程。
使用MyBatis的安全防御代码: MyBatis通过预编译SQL和参数化查询,自动将输入的值进行转义,防止SQL注入。
java
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")
User loginUser(@Param("username") String username, @Param("password") String password);
}
或者使用mybatis-plus提供的安全查询方法:
java
// 构建安全查询,避免报错注入
public List<User> safeQuery(String input) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.apply("UpdateXML(null, {0}, null)", input); // 参数化处理
return userMapper.selectList(queryWrapper);
}