【Web】基于Mybatis的SQL注入漏洞利用点学习笔记

目录

MyBatis传参占位符区别

不能直接用#{}的情况

in多参数值查询

like %%模糊查询

order by列名参数化


MyBatis传参占位符区别

在 MyBatis 中,#{}${} 都是用于传参的占位符,但它们之间有很大的区别,主要体现在两个方面:参数值的类型和 SQL 注入问题。

1.参数值的类型:

 ①  #{} 是预编译参数,表示使用 PreparedStatement 时,使用 setXXX() 方法设置参数值,会对传入的参数进行类型处理,确保传递的参数类型正确。一般来说,我们在使用 MyBatis 进行 CRUD 操作时,都应该使用 #{} 来传递参数,这样可以有效地避免 SQL 注入问题。
 ②  ${} 是字符串拼接,表示在 SQL 语句中直接插入传入的参数值,不会对传入的参数类型进行处理。如果传入的参数是字符串类型,那么在 SQL 语句中使用时,需要使用单引号将其括起来,否则会抛出 SQL 语法错误异常。因此,在使用 ${} 时,需要特别注意避免 SQL 注入问题。

简而言之:

如果传入Z3r'4y
# PrepareStatement ? 填充参数 类型化 转义处理 返回一个'Z3r\'4y'
$ Statement 拼接参数 返回一个Z3r'4y

2.SQL 注入问题:

 ①  #{} 可以避免 SQL 注入问题,因为它会对传入的参数进行类型处理,并将参数值转义后再放到 SQL 语句中,保证了 SQL 语句的安全性。
 ②  ${} 存在 SQL 注入问题,因为 SQL 语句中插入的是传入的参数值,如果参数值中包含 SQL 语句的关键字或特殊字符,可能会导致 SQL 注入攻击。

举个例子:

<!-- 使用#,不存在漏洞;默认都是PREPARED--><select id="findUserById" resultType="com.example.mybaits.entity.User" statementType="PREPARED">SELECT * FROM tbuser where id= #{id}</select><!-- 使用$,存在注入漏洞 --><select id="findUserByName" resultType="com.example.mybaits.entity.User">SELECT * FROM tbuser where userName='${username}'</select>

总结一下:原则就是能用#{}就不要用${}

不能直接用#{}的情况

因为一些sql语言的性质,一些情况不能直接用#{}(传参强制被引号包裹导致sql语义错误)

比如下面这种情况:

如果直接SELECT * FROM tbuser where id in (#{ids})并传参ids=1,2,3就会拼接成:

SELECT * FROM tbuser where id in ('1,2,3');

从而出现只调出一行的谬误

解决方案如下:

in多参数值查询

 <!-- in查询,错误写法 --><select id="findUserInIds" resultType="com.example.mybaits.entity.User" >SELECT * FROM tbuser where id in (${ids})</select><!-- in查询,正确写法 --><select id="findUserInIdsRight" resultType="com.example.mybaits.entity.User" >SELECT * FROM tbuser where id in<foreach collection="list" item="ids" open="(" close=")" separator=",">#{ids}</foreach></select>

like %%模糊查询

 <!-- 模糊查询,错误写法 --><select id="findUserLikeName" resultType="com.example.mybaits.entity.User">SELECT * FROM tbuser where userName like '%${username}%'</select><!-- 模糊查询,正确写法 --><select id="findUserLikeName" resultType="com.example.mybaits.entity.User">SELECT * FROM tbuser where userName like concat('%',#{username}, '%')</select>

order by列名参数化

<!--动态指定列名排序,有注入漏洞--><select id="allUserSeq" resultType="com.example.mybaits.entity.User">SELECT *FROM tbuser order by ${colName}
</select>

基于MyBatis并不能很好解决这种注入漏洞

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络基础 第四章——介质访问控制子层 知识点(上)

4.1局域网技术的发展与演变 1.访问控制的基本概念 介质访问控制(MAC)是所有“共享介质"类型的局域网都必须解决的共性问题。理解 介质访问控制方法的基本概念,需要注意以下两个问题。 (1)对术语“共享介质”、“多路访问”与“冲突"的理解 由于“共享介质”与“多…

如何开发一个游戏平台?

随着科技的进步和互联网的普及&#xff0c;游戏行业正在迅速发展。游戏平台的开发已成为游戏行业的一个重要组成部分。开发一个游戏平台需要深入了解游戏行业&#xff0c;掌握相关技术&#xff0c;并具备创新思维。以下是一些关于如何开发一个游戏平台的建议&#xff1a; 市场调…

STL - map 和 set

1、关联式容器 vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<…

Nginx 配置 SSL证书

成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问Nginx服务器。 一、准备材料 SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射。您可以通过DNS验证证书工具&#xff0c;检测域名DNS解析是否生效。具体操作&#xff1a; 【1】登录…

Three.js学习8:基础贴图

一、贴图 贴图&#xff08;Texture Mapping&#xff09;&#xff0c;也翻译为纹理映射&#xff0c;“贴图”这个翻译更直观。 贴图&#xff0c;就是把图片贴在 3D 物体材质的表面&#xff0c;让它具有一定的纹理&#xff0c;来为 3D 物体添加细节的一种方法。这使我们能够添加…

numpy 查漏补缺

1. iterating 2. 3. 4. 5. 6. 7. 8. 9.

Blender教程(基础)--试图的显示模式-22

一、透视模式&#xff08;AltZ&#xff09; 透视模式下可以实现选中透视的物体信息 发现选中了透视区的所有顶点 二、试图着色模式-显示网格边框 三、试图着色模式-显示实体 三、试图着色模式-材质预览 四、试图着色模式-显示渲染预览

test222

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

开源微服务平台框架的特点是什么?

借助什么平台的力量&#xff0c;可以让企业实现高效率的流程化办公&#xff1f;低代码技术平台是近些年来较为流行的平台产品&#xff0c;可以帮助很多行业进入流程化办公新时代&#xff0c;做好数据管理工作&#xff0c;从而提升企业市场竞争力。流辰信息专业研发低代码技术平…

【GO语言卵细胞级别教程】03.条件与循环语句

注意&#xff1a;以下演示所用的项目&#xff0c;在第一章节已经介绍了&#xff0c;这里不做赘述 目录&#xff1a; 【GO语言卵细胞级别教程】03.条件与循环语句1.条件语句1.1 if语句1.1.1 单层if语句1.1.2 if-else语句1.1.3 if-else-if 语句1.1.4 if 嵌套 1.2 switch 语句1.1…

问题:老年人心理健康维护与促进的原则为________、________、发展原则。 #媒体#知识分享

问题&#xff1a;老年人心理健康维护与促进的原则为________、________、发展原则。 参考答案如图所示

Java强训day17(选择题编程题)

选择题 编程题 题目1 import java.util.Scanner;public class Main { public static void main(String[] args) {Scanner sc new Scanner(System.in);char[] c1 sc.nextLine().toCharArray();char[] c2 sc.next().toCharArray();//取c2[0]if(c2[0]>A && c2[…

从一到无穷大 #23 《流计算系统图解》书评

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言内容总结 引言 春节假期回到家里断然是不会有看纸质书的时间的。造化弄人&#…

微服务OAuth 2.1扩展额外信息到JWT并解析(Spring Security 6)

文章目录 一、简介二、重写UserDetailsService三、Controller解析JWT获取用户信息四、后记 一、简介 VersionJava17SpringCloud2023.0.0SpringBoot3.2.1Spring Authorization Server1.2.1Spring Security6.2.1mysql8.2.0 Spring Authorization Server 使用JWT时&#xff0c;前…

jmeter-问题二:JMeter进行文件上传时,常用的几种MIME类型

以下是一些常用的MIME类型及其对应的文件扩展名&#xff1a; 文本类型: text/plain: 通常用于纯文本文件&#xff0c;如 .txt 文件。 text/html: 用于HTML文档&#xff0c;即 .html 文件。 application/msword: Microsoft Word文档&#xff0c;即 .doc 和 .docx 文件。 图像…

SparkJDBC读写数据库实战

默认的操作 代码val df = spark.read.format("jdbc").option("url", "jdbc:postgresql://localhost:5432/testdb").option("user", "username").option("password", "password").option("driver&q…

《剑指 Offer》专项突破版 - 面试题 37 : 小行星碰撞(C++ 实现)

题目链接&#xff1a;LCR 037. 行星碰撞 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 输入一个表示小行星的数组&#xff0c;数组中每个数字的绝对值表示小行星的大小&#xff0c;数字的正负号表示小行星运动的方向&#xff0c;正号表示向右飞行&#xff0c;负…

【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、分布…

自动化UI,API和DevOps测试架构设计与实现

自动化测试是软件开发过程中的重要环节&#xff0c;它可以提高测试效率、减少人工测试的工作量。本文将介绍自动化测试架构的设计原则和实现方法&#xff0c;以帮助读者理解如何构建一个可靠、可扩展和易于维护的自动化测试框架。 1. 什么是自动化测试&#xff1f; - 解释了…

【java】简单的Java语言控制台程序

一、用于文本文件处理的Java语言控制台程序示例 以下是一份简单的Java语言控制台程序示例&#xff0c;用于文本文件的处理。本例中我们将会创建一个程序&#xff0c;它会读取一个文本文件&#xff0c;显示其内容&#xff0c;并且对内容进行计数&#xff0c;然后将结果输出到控…