Mybatis防止SQL注入

防止SQL注入的中心思想就是参数化查询,将输入当作参数传递,而不是直接拼接到 SQL 语句中。

常见的防止SQL注入的方式

  • 1、使用#{}占位符

  • 2、使用动态SQL

  • 3、[配置 SQL 注入过滤器](#配置 SQL 注入过滤器)

使用#{}占位符

  • 先来看一个错误的示范${}
// 错误示范
@PostMapping("mybatiswrong")
public List mybatiswrong(@RequestParam("name") String name) {//curl -X POST http://localhost:18081/sqlinject/mybatiswrong?name=test//python sqlmap.py -u  http://localhost:18081/sqlinject/mybatiswrong --data name=test --current-db --flush-sessionreturn userDataMapper.findByNameWrong(name);
}@Select("SELECT id,name FROM `userdata` WHERE name LIKE '%${name}%'")
List<UserData> findByNameWrong(@Param("name") String name);
  • 使用sqlmap测试是否注入
C:\Python310\sqlmap>python sqlmap.py -u  http://localhost:18081/sqlinject/mybatiswrong --data name=test --current-db --flush-session
...........................[13:32:44] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.6
[13:32:44] [INFO] fetching current database
current database: 'sqlinject'
....................................C:\Python310\sqlmap>

从结果可以看出来,注入成功了,获取到了数据库名称。

${} 占位符会将参数值直接替换到 SQL 语句中。这可能导致 SQL 注入的风险,因此应谨慎使用。只有当你完全信任传入的值并且确定它是安全的时,才可以使用${} 占位符。

  • #{}占位符
@PostMapping("mybatisright")
public List mybatisright(@RequestParam("name") String name) {//curl -X POST http://localhost:18081/sqlinject/mybatisright?name=test// python sqlmap.py -u  http://localhost:18081/sqlinject/mybatisright --data name=test --current-db --flush-sessionreturn userDataMapper.findByNameRight(name);
}//正确示范,采用#{} 占位符的方式
@Select("SELECT id,name FROM `userdata` WHERE name LIKE CONCAT('%',#{name},'%')")
List<UserData> findByNameRight(@Param("name") String name);
  • 使用sqlmap测试是否注入
C:\Python310\sqlmap>python sqlmap.py -u  http://localhost:18081/sqlinject/mybatisright --data name=test --current-db --flush-session
................................[13:37:28] [WARNING] POST parameter 'name' does not seem to be injectable
[13:37:28] [CRITICAL] all tested parameters do not appear to be injectable. Try to increase values for '--level'/'--risk' options if you wish to perform more tests. If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could try to use option '--tamper' (e.g. '--tamper=space2comment') and/or switch '--random-agent'C:\Python310\sqlmap>

从结果可以看出来注入失败,Mybatis将#{}参数值视为一个 JDBC 参数,而不是 SQL 语句的一部分。MyBatis 会自动将参数值进行转义,确保其安全性。

  • ${}VS #{}对比

这两位同志有各自的用处,

${}#{}
拼接符占位符
字符串替换,SQL拼接SQL预编译
执行前:select * from t_user where uid= ‘${uid}’ 执行后:select * from t_user where uid= ‘1’执行前: select * from t_user where uid=#{uid} 执行后:select * from t_user where uid= ?
不能防止sql 注入能防止sql 注入

使用动态SQL

MyBatis提供了动态SQL的功能,可以根据条件动态拼接SQL语句。在使用动态SQL时,MyBatis会自动对参数值进行转义,从而防止注入攻击。

<select id="findByNameDynamic" resultType="icu.kevin.dataandcode.sqlinject.UserData">SELECT id, nameFROM `userdata`<where><if test="name != null">AND name LIKE CONCAT('%',#{name},'%')</if></where></select>
  • 使用sqlmap探测,发现确实达到了防止注入的能力。

配置 SQL 注入过滤器

// 配置 SQL 注入过滤器
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.addInterceptor(new SqlExplainInterceptor());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL的pg_dirtyread工具

PostgreSQL的pg_dirtyread工具 pg_dirtyread 是一个第三方PostgreSQL扩展&#xff0c;它允许用户读取数据库文件中的“脏”数据&#xff0c;即那些被标记为删除或不再可见的数据。这个扩展对于数据恢复和调试非常有用&#xff0c;尤其是在需要恢复被删除或更新前的数据时。 以…

33.异步FIFO IP核的配置、调用与仿真

&#xff08;1&#xff09;异步FIFO的配置过程&#xff1a; ps&#xff1a;异步fifo相比较同步fifo少一个实际深度 &#xff08;2&#xff09;异步FIFO的调用: module dcfifo (input wr_clk ,input rd_clk ,input [7:0] …

2024-07-13 Unity AI状态机2 —— 项目介绍

文章目录 1 项目介绍2 模块介绍2.1 BaseState2.2 ...State2.2.1 PatrolState2.2.2 ChaseState / AttackState / BackState 2.3 StateMachine2.4 Monster 3 其他功能4 类图 项目借鉴 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 项目介绍 ​ 本项目使用 Unity 2…

金融业务系统云原生技术转型:从传统架构到云原生的跨越

引言 在数字化浪潮的推动下&#xff0c;金融行业正经历着前所未有的变革。云计算作为这场变革的核心技术之一&#xff0c;正在重塑金融机构的IT架构。云原生技术以其敏捷性、弹性和可扩展性&#xff0c;为金融业务提供了强大的技术支撑&#xff0c;使得金融机构能够快速响应市…

大话设计模式

设计模式 专栏概览 参考《大话设计模式》&#xff0c;进行深入分析理解&#xff1b;使用C实现&#xff0c;然后C采取OOP仿照实现&#xff1b;C不是不能OOP,只是底层支持没那么好&#xff0c;所以C代码部分只是推荐参考&#xff1b;关于C的OOP推荐书籍&#xff1a;周立功的《嵌…

防火墙NAT和智能选路实验详解(华为)

目录 实验概述实验拓扑实验要求要求一要求二要求三要求四要求五 实验概述 从我上面一个博客能够了解到NAT和防火墙选路原理 ——>防火墙nat和智能选路&#xff0c;这一章我通过实验来详解防火墙关于nat和智能选路从而能熟练使用和配置防火墙&#xff0c;这里使用的是华为US…

《Cross-Image Pixel Contrasting for Semantic Segmentation》论文解读

期刊&#xff1a;TPAMI 年份&#xff1a;2024 摘要 研究图像语义分割问题。目前的方法主要集中在通过专门设计的上下文聚合模块(如空洞卷积、神经注意力)或结构感知的优化目标(如iou样损失)挖掘"局部"上下文&#xff0c;即单个图像中像素之间的依赖关系。然而&…

如何解决数据分析问题:IPython与Pandas结合

如何解决数据分析问题&#xff1a;IPython与Pandas结合 数据分析是现代科学研究、商业决策和技术开发中的一个重要环节。IPython和Pandas是两个强大的工具&#xff0c;它们可以大大简化和加速数据分析的过程。本文将为初学者详细介绍如何结合使用IPython和Pandas来解决数据分析…

Dify中高质量索引模式时,通过线程池处理chunk过程

本文主要介绍了Dify中高质量索引模式时,如何通过线程池执行器来处理chunk的过程。源码位置:dify\api\core\indexing_runner.py\IndexingRunner._load。核心思想:假设一个数据集中有一个文档,该文档可以拆分为12个段(segment)。如果chunk_size=10,那么分为2批提交给线程池…

Mojo语言的运用

1.Mojo语言概述 1.1什么是Mojo语言&#xff1f; Mojo语言是一种现代的动态编程语言&#xff0c;主要用于Web开发。它结合了多种语言的优点&#xff0c;如JavaScript、Perl和Lua&#xff0c;旨在为开发者提供&#xff1a; 简洁的语法&#xff1a;易于学习和使用&#xff0c;适…

Azcopy Sync同步Azure文件共享

Azcopy Sync同步Azure文件共享 一、工作原理二、安装 AzCopy在 Windows 上在 Linux 上 三、资源准备1. 创建源和目标 Azure 存储账户2. 创建源和目标文件共享3. 确定路径4. 生成源和目的存储账户的共享访问签名&#xff08;SAS&#xff09;令牌配置权限示例生成的 URL 四、Azco…

【鸿蒙学习笔记】尺寸设置・width・height・size・margin・padding・

官方文档&#xff1a;尺寸设置 目录标题 width&#xff1a;设置组件自身的宽度height&#xff1a;设置组件自身的高度size&#xff1a;设置高宽尺寸margin&#xff1a;设置组件的外边距padding&#xff1a;设置组件的内边距 width&#xff1a;设置组件自身的宽度 参数为Length…

PYTHON自学班车(三)NUMPY

动 array 索引 arrayname[start,end,step]得到的数据范围是[start,end) 可以用array[row][col]来获取指定行、列的值&#xff0c;同时可以用array(row,col)来获取指定行、列的值。 矩阵合并 vstact() 垂直合并 hstac() 横向合并 矩阵拆分

python通过集合去重并保持原来的顺序不变

代码 shelloworldhelloworldadfdfdeoofllffe new_sset(s) lstlist(new_s) lst.sort(keys.index) print(.join(lst))运行效果 helowrdaf原来h在最前面&#xff0c;f在最后面。得到的结果也是这样。

【Linux杂货铺】3.程序地址空间

1.程序地址空间的引入 fork(&#xff09;函数在调用的时候子如果是子进程则返回0&#xff0c;如果是父进程则返回子进程的pid&#xff0c;在代码中我们分别在子进程和父进程读取全局变量g_val的时候居然出现了俩个不同的值。如下&#xff1a; #include<stdio.h> #includ…

【随想】闲聊、沟通和谈判

闲聊、沟通和谈判基本上是我们平时与人说话的三种常见形式了。这里分析一下这三种说话形式的区别是什么。 闲聊是进入沟通之前的铺垫&#xff0c;其说话基本上全是安全话题&#xff0c;没有明确的利益目的&#xff0c;唯一的目标是有话说&#xff0c;不冷场&#xff0c;你一言…

【Linux】软件管理工具 yum

文章目录 概念搜索&#xff1a;yum list安装&#xff1a;yum install卸载&#xff1a;yum remove 概念 在Linux下安装软件&#xff0c;可以下载到程序的源代码&#xff0c;进行编译得到可执行程序&#xff0c;另外这些软件还有依赖其它工具的问题&#xff0c;还得下载编译这些依…

底软驱动 | Linux字符设备驱动开发基础

文章目录 知识整理--Linux字符设备驱动开发基础字符设备基础1从一个最简单的模块源码说起字符设备驱动工作原理字符设备驱动代码实践--给空模块添加驱动壳子应用程序如何调用驱动 字符设备基础2添加读写接口&#xff08;应用和驱动之间的数据交换&#xff09;驱动中如何操控硬件…

WIFI连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 1 实现功能…

GO语言中的接口(interface)

go 接口 interface 1、什么是接口&#xff08;interface&#xff09;&#xff1f;2、注意事项3、interface底层实现4、侵入式与非侵入式5、接口的应用场景空接口的应用场景 6、其他使用 1、什么是接口&#xff08;interface&#xff09;&#xff1f; 在Go语言中&#xff0c;接口…