【Java代码审计 | 第三篇】SQL注入之Hibernate、MyBatis-MyBatis 的两种写法

时间:2025-03-10 07:24:50

注意:在 Maven 项目 中,mapper.xml 文件必须存放在 resources 目录 下,才能被 MyBatis 正确识别并加载。

MyBatis 主要提供了两种方式来执行 SQL 查询:基于注解的方式基于 XML 配置的方式

1. 基于注解的 MyBatis 写法

@Mapper
public interface CategoryMapper {
    @Select("SELECT * FROM category_ WHERE name= '${name}' ")
    CategoryM getByName(@Param("name") String name);
}

在这种方式下,SQL 语句直接写在 @Select 注解 中,MyBatis 会在运行时解析并执行该 SQL 语句。

2. 基于 XML 配置的 MyBatis 写法

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.seaii.springboot.mapper.CategoryMapper">
    <select id="get" resultType="cn.seaii.springboot.pojo.CategoryM">
        SELECT * FROM category_ WHERE id= ${id}
    </select>
</mapper>

在 XML 方式中,SQL 语句被写入独立的 mapper.xml 文件中,并通过 namespace 关联接口,实现 SQL 的分离管理。

上述代码中的 WHERE name= '${name}'WHERE id= ${id} 直接拼接用户输入,可能导致 SQL 注入漏洞

解决方案

应该使用 #{} 方式 绑定参数,避免 SQL 注入问题。

基于注解

@Mapper
public interface CategoryMapper {
    @Select("SELECT * FROM category_ WHERE name= #{name}")
    CategoryM getByName(@Param("name") String name);
}

基于 XML

<select id="get" resultType="cn.seaii.springboot.pojo.CategoryM">
    SELECT * FROM category_ WHERE id = #{id}
</select>

这样,MyBatis 会自动 将参数作为占位符处理,避免 SQL 注入风险。