当前位置: 首页 > 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.dtcms.com/a/280352.html

相关文章:

  • 153.在 Vue 3 中使用 OpenLayers + Cesium 实现 2D/3D 地图切换效果
  • java中的接口
  • JavaScript 动态访问嵌套对象属性问题记录
  • HarmonyOS-ArkUI: Web组件加载流程1
  • 暴力破解:攻破系统的终极密钥
  • Rust指针选择
  • 安装带GPU的docker环境
  • 20250715使用荣品RD-RK3588开发板在Android13下接入USB3.0接口的红外相机
  • 【I3D 2024】Deblur-GS: 3D Gaussian Splatting from Camera Motion Blurred Images
  • 记录一条面试sql题目
  • JS中async/await功能介绍和使用演示
  • 普通字符类型和new String有什么区别
  • 使用JS编写动态表格
  • 【env环境】rtthread5.1.0使用fal组件
  • AI的外挂知识库,RAG检索增强生成技术
  • 【PTA数据结构 | C语言版】将表达式树转换成中缀表达式
  • 数仓面试题
  • 2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?
  • docker停止所有容器和删除所有镜像
  • 从一道题目(阿里2014 Crackme_2)开启unidbg还原算法入门(转载)
  • 强化学习书籍
  • vscode 打开c++文件注释乱码
  • 分布式存储之Ceph使用指南--部署篇(未完待续)
  • Claude 背后金主亚马逊亲自下场,重磅发布 AI 编程工具 Kiro 现已开启免费试用
  • 【交叉编译报错】fatal: not a git repository (or any of the parent directories): .git
  • 分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
  • 内存的基础相关知识,什么是内存,内存管理
  • 死锁问题以及读写锁和自旋锁介绍【Linux操作系统】
  • Spring 中 @Component和@Bean注解的区别
  • 为何说分布式 AI 推理已成为下一代计算方式