【Java代码审计(2)】MyBatis XML 注入审计

代码背景:某公司使用 MyBatis 作为持久层框架,登录功能如下:

Java 接口代码:

复制代码
public interface UserMapper {
    User findByUsernameAndPassword(@Param("username") String username,
                                    @Param("password") String password);
}

XML 配置(UserMapper.xml)如下:

复制代码
<select id="findByUsernameAndPassword" parameterType="map" resultType="User">
    SELECT * FROM users 
    WHERE username = '${username}' 
      AND password = '${password}'
</select>

先来分析一下java接口代码
UserMapper是MyBatis约定俗称的,MyBatis数据的访问接口都叫xxxxUser说明这里是要操作User表

复制代码
User findByUsernameAndPassword(...)

User:这是返回值类型,说明这个方法会返回一个 User 类型的 Java 对象。

复制代码
int add(int a, int b);        // 返回 int
String getName();             // 返回 String
void logout();                // 返回 void(表示没有返回值)
User findByUsername(...);     // 返回 User

findByUsernameAndPassword:方法名称。看名字就知道,它表示"根据用户名和密码查找用户"。

复制代码
@Param("username") String username,
@Param("password") String password

这是传入的两个参数

告诉 MyBatis:我这个 String username 参数,在 SQL 里要叫 username。

如果不添加@Param("username")

那么在编译成.class文件后,这个方法里面的参数会变成

复制代码
(String arg0, String arg1)

那么Mybatis就读不到你叫他username,password

现在再来分析XML文件

复制代码
<select id="findByUsernameAndPassword" parameterType="map" resultType="User">
  • <select id =xxxxx>要把这个 SQL 查询语句,绑定到 Java 接口里的 findByUsernameAndPassword() 方法上,等你调用这个方法的时候,我就执行这个 SQL,并把查到的数据返回回去。
  • parameterType="map" 表示传入的方法是表示方法传入的是 Map 类型(键值对)
  • resultType="User"查询结果将映射成 User 类型的 Java 对象

接下来就是sql语法了,这里需要关注
${}和#{}

#{} 是安全的参数占位符(预编译/参数化)

${} 是直接字符串拼接(不安全,容易 SQL 注入)

但是如果必须使用${}时,就需要添加白名单

比方说:动态排序

如果写成
select * from users order by #{}

数据库就会报错 Unknown column '?'

因为数据库只会把值参数化,而不会把结构参数化!

相关推荐
weixin_460443562 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w5 小时前
什么是AOP
java
EasyGBS5 小时前
摄像头还在线,画面已经不能用了?国标GB28181视频平台EasyGBS视频质量诊断怎么用
服务器·安全·音视频
Cc.Y5 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck6 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787056 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev6 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha6 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞6 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
迪康Defender6 小时前
终端安全审批体系设计:如何平衡安全管控与业务连续性
运维·服务器·安全·运维开发·学习方法·业界资讯·远程工作