当前位置: 首页 > news >正文

【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 '?'
因为数据库只会把参数化,而不会把结构参数化!

http://www.lryc.cn/news/589231.html

相关文章:

  • Datawhale AI夏令营 机器学习2.1
  • AWS中国区资源成本优化全面指南:从理论到实践
  • 从零开始的python学习(八)P115+P116+P117+P118+P119+P120+P121+P122
  • 第十三讲 | map和set的使用
  • Windows内核对象
  • 【AutoCAD保姆级安装教程】AutoCAD 2025 版详细图文下载安装教程
  • wkhtmltopdf导出pdf调试参数
  • 【08】MFC入门到精通——MFC模态对话框 和 非模态对话框 解析 及 实例演示
  • 农村养老模式:乡土智慧与时代创新的共生之路
  • Gitlab跑CICD的时候,maven镜像和pom.xml使用的maven版本冲突导致没办法build成功的解决方法
  • 【C#地图显示教程:实现鼠标绘制图形操作】
  • jmeter之随机读取csv文件
  • jmeter提取接口返回值,对比去重
  • 说下对mysql MVCC的理解
  • LeetCode|Day13|88. 合并两个有序数组|Python刷题笔记
  • 记录一条面试sql题目
  • 《每日AI-人工智能-编程日报》--2025年7月15日
  • vue实现el-table-column中自定义label
  • 对象数组列表转成树形结构--树形结构转成列表(处理菜单)
  • 牛客:HJ21 简单密码[华为机考][哈希]
  • T8332AD这是一款多拓扑芯片质量很硬朗?
  • 【jvm|基本原理】第四天
  • 力扣 hot100 Day45
  • LeetCode Hot100 【1.两数之和、2.两数相加、3.无重复字符的最长子串】
  • 拼多多笔试题目一
  • 人机协作系列(四)AI编程的下一个范式革命——看Factory AI如何重构软件工程?
  • 力扣——1071. 字符串的最大公因子
  • 基于Alpine构建MySQL镜像
  • sublime如何支持换行替换换行
  • PHP安全漏洞深度解析:文件包含与SSRF攻击的攻防实战