【安全】mybatis中#{}和${}导致sql注入问题及解决办法

2024-01-24

0.问题

使用mybatis的时候遇到了#{}和${}可能导致sql注入的问题

1.预先了解

(1)#{}

  • #{} 底层通过prepareStatement对当前传入的sql进行了预编译,一个 #{ } 被解析为一个参数占位符 ?;
  • #{} 解析之后会将String类型的数据自动加上引号,其他数据类型不会
  • #{} 很大程度上可以防止sql注入(sql注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作)
  • #{} 一般用在insert的字段和where条件中,用来防止sql注入

(2)${}

  • ${}仅仅为一个纯粹的 string 替换,在动态sql解析阶段将会进行变量替换
  • ${} 解析之后是什么就是什么
  • ${} 用在sql字符串拼接中,使用时需要非常谨慎。但是像一些没有直接和系统用户接触的功能如动态切换表名,库名呀就不存在注入问题了。一旦要使用在要被用户直接接触的sql中,一定要注意!

2.举个栗子

(1)${}

1)sql注入
@Select("select * from user where name = ${name}")
List<User> sqltest1(String name);

如果传进去的参数是

name = "1' OR 1='1";

那么数据库最后执行的语句则为

select * from user where name = '1' OR 1='1 ';

会直接导致sql注入,被攻击者成功登录

2)语句堵塞
@Select("select * from user order by ${column}")
List<User> sqltest1(String column);

如果传进去的参数是

column = "id,(select 1 from (select sleep(1000))a)"

那么数据库最后执行的语句则为

select * from user order by id,(select 1 from (select sleep(1000))a)

可以发现程序会阻塞1000秒,被攻击者造成语句堵塞

(2)#{}

1)无法执行
   @Select("select * from user order by #{column}")
    List<User> sqltest1(String column);

如果传进去的参数是

column = "name";

那么#{}会自动给参数加上单引号,数据库语句变成

select * from user order by 'name'

无法正常执行

2)无法执行
@Select("select * from user where name like '%#{name}%'")
List<User> sqltest2(String name);

如果传入的参数为

name = "yin";

那么数据库语句就变成

select * from user where name like '%'name'%'

直接报错,无法执行

3.解决办法

正常来看,一般的解决方法可以使用#{}来代替 KaTeX parse error: Expected 'EOF', got '#' at position 14: {},但是有的语句如果使用#̲{}会造成语句错误(因为#{}… {}的有动态指定order
by 排序字段、和like模糊匹配,但是这种方式会带来sql注入问题。具体解决方法如下:

(1)动态指定order by 排序字段

自定义一个Map,存入的key为前端传过来的值,value则是参与自定义排序的字段名。真正进行自定义排序的时候使用这个map即可。

// key为前端传的值,value为数据库对应的列值
    public static Map<String,String> orderByKeyMap = new HashMap<String,String>(){
        {
            put("userId","id");
            put("name","name");
        }



@Select("select * from user order by #{column}")
List<User> sqltest1(String column);



 List<User> users = mapper.sqltest3(User.orderByKeyMap.get("name"));

这样就不会出错了

(2)like模糊匹配

可以使用concat来拼接#{}的字符串,这样就不会报错,也不会导致索引失效

 @Select("select * from user where name like concat('%',#{name},'%')")
List<User> sqltest2(String name);

参入参数

name = "yin";

执行的语句就编程

select * from user where name like concat('%','yin','%');

这样就解决问题了

4.如何防止sql注入?

1. 使用预编译机制

尽量用预编译机制,少用字符串拼接的方式传参,它是sql注入问题的根源。

2. 要对特殊字符转义

有些特殊字符,比如:%作为like语句中的参数时,要对其进行转义处理。

3. 要捕获异常

需要对所有的异常情况进行捕获,切记接口直接返回异常信息,因为有些异常信息中包含了sql信息,包括:库名,表名,字段名等。攻击者拿着这些信息,就能通过sql注入随心所欲的攻击你的数据库了。目前比较主流的做法是,有个专门的网关服务,它统一暴露对外接口。用户请求接口时先经过它,再由它将请求转发给业务服务。这样做的好处是:能统一封装返回数据的返回体,并且如果出现异常,能返回统一的异常信息,隐藏敏感信息。此外还能做限流和权限控制。

4. 使用代码检测工具

使用sqlMap等代码检测工具,它能检测sql注入漏洞。

5. 要有监控

需要对数据库sql的执行情况进行监控,有异常情况,及时邮件或短信提醒。

6. 数据库账号需控制权限

对生产环境的数据库建立单独的账号,只分配DML相关权限,且不能访问系统表。切勿在程序中直接使用管理员账号。

7. 代码review

建立代码review机制,能找出部分隐藏的问题,提升代码质量。

8. 使用其他手段处理

对于不能使用预编译传参时,要么开启druid的filter防火墙,要么自己写代码逻辑过滤掉所有可能的注入关键字。

学习计划安排


我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~

这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

如果你对网络安全入门感兴趣,那么你需要的话可以

点击这里 ????

①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【安全】mybatis中#{}和${}导致sql注入问题及解决办法 的相关文章

  • 非聚合查询内部的聚合情况

    我有一个相当大的查询 其最简单的形式如下所示 select r rep id u user id u signup date pi application date pi management date aum from table1 r
  • MS-Access:合并彼此“下方”的两个表

    我的 Access 数据库中有两个表 它们看起来像这样 Table1 Kabelnummer Column1 Column2 Column3 1 x x x 2 x x x
  • 从有序结果集中查找“运行”行

    我试图找出一种方法来识别满足某些条件的 运行 结果 按顺序连续行 目前 我正在订购结果集 并通过眼睛扫描特定模式 这是一个例子 SELECT the date name FROM orders WHERE the date BETWEEN
  • 如何将 SQL 参数中的字符串数组传递给 SQL 中的 IN 子句

    我正在以复杂的方式做一个逻辑 我只需要在存储过程中执行此查询 select Sizes SUM Quantity from tbl SizeBreakup where Brand brand and Combo in 1 2 我必须在 C
  • 如何对 MySQL 数据库中的 ENUM 列进行排序?

    I have colorMySQL 表中的列类型为ENUM RED YELLOW MY COLOR BLACK 还有另一个name列的类型是VARCHAR 30 我想按以下顺序获取所有表行 YELLOW首先行 排序依据name RED最后一
  • 如何使用 XQuery 将值列表从 XML 提取到行中?

    我有一个 XQuery 如下 DECLARE x XML SELECT x
  • SQL 连接表

    表一包含 ID Name 1 Mary 2 John 表二包含 ID Color 1 Red 2 Blue 2 Green 2 Black 我想结束的是 ID Name Red Blue Green Black 1 Mary Y Y 2 J
  • 使用 avg 和 group by 进行 SQL 查询

    我在为 MySQL 编写 SQL 查询时遇到一些问题 我有一个具有以下结构的表 mysql gt select id pass val from data r1 limit 10 id pass val DA02959106 5 00000
  • 在 SQL where 子句中使用带有 IsDate 的 case 语句

    我正在尝试清理以下代码中的 where 子句语句 SELECT CONVERT datetime UTC Time Stamp 127 AS TimeStamp FROM Table WHERE CASE WHEN ISDATE UTC T
  • 为什么我的层次结构查询显示重复记录?

    我的要求是找到一个月中所有过去的天数 以下是我的示例查询 CREATE TABLE custom date full sno NUMBER curr date DATE INSERT INTO custom date full VALUES
  • MYSQL插入GB大小的巨大SQL文件

    我正在尝试创建 Wikipedia DB 副本 大约 50GB 但在处理最大的 SQL 文件时遇到问题 我使用 linux split 实用程序将 GB 大小的文件拆分为 300 MB 的块 例如 split d l 50 enwiki 2
  • WCF 模拟和 SQL 可信连接?

    我们有一个托管在 IIS7 下的服务 SQL 服务器的连接字符串设置为 受信任 为了进行身份验证 我需要在服务上设置模拟并让客户端启动模拟连接 有没有办法不设置模拟并仍然允许服务通过可信连接登录到 SQL Server 我们希望避免让客户端
  • db2:使用不同表上的选择更新多行和字段

    对于 A 的所有行 其中 A x B z 是否可以使用不同表 B c B d 的值 c 和 d 来增加表 A a 和 A b 的字段 a 和 b 我对这个查询感到疯狂 DB2 和 SQL 标准在 UPDATE 语句中没有 FROM 子句 所
  • 除了连接之外还有其他方法可以提高性能吗?

    除了连接之外还有其他方法可以提高性能吗 编辑 gbn 相关连接或相关子查询与存在子句哪个更好 https stackoverflow com questions 3305891 为什么没有人提到嵌套循环连接 这不是 JOIN 的 替代 方式
  • 无法通过 PyODBC 连接创建数据库

    我在用pyodbc in python 2 7 with MS SQL Server 2008R 这是我创建数据库的代码 SQL代码单独在SQL中工作正常 但在python中执行时崩溃 SQL command IF EXISTS SELEC
  • 在 Microsoft Access 中编写查询,字段描述错误 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 替换 Select 语句中的 NULL 和空字符串

    我有一个专栏可以有NULL或空白区域 即 值 我想用有效值替换这两个值 例如 UNKNOWN 我发现的各种解决方案建议修改表本身内的值 然而 在这种情况下 这不是一个选项 因为数据库用于开发和 或修补得非常差的第三方应用程序 实际上 我认为
  • 如何实现复杂的sql命令

    我在 MySQL 中有一个 sql 表 其中包含以下记录 user dob john 1 10 96 jane 3 4 97 jill 1 8 96 jack 2 9 00 jane 12 14 07 john 1 11 98 这是我要执行
  • PostgreSQL 对 string\varchar 的各种清理

    我必须通过以下方式清理一些 varchar 删除特殊字符 例如 来自封闭列表 我已经成功地通过大量使用replace regexp replace来做到这一点 但我正在寻找类似于SQL Server中的东西 删除以下数字但不删除相邻的数字含
  • 将文件名存储在变量中并在 SSIS 中使用该文件名创建表

    我在 SSIS 的一个文件夹中只有几个 excel 源文件 我想从这些 Excel 文件中提取数据并加载到 SQL 表中 我的问题是我想一一保存所有文件名 并想创建与文件名完全相同的 SQL 表 然后要加载相应表中的每个Excel文件 请帮

随机推荐

  • 高中数学:因式分解(初接高)

    一 乘法公式 二 十字相乘法 例题 三 增添项法 主要解决整式中含高次项的因式分解题 补充 由于数学笔记 用键盘敲实在是麻烦 这里就把我的笔记截图上来了 大家将就看 有看不清楚的地方 可评论 定回复
  • 实力认证!鼎捷软件荣膺“领军企业”和“创新产品”两大奖项

    近日 由中国科学院软件研究所 中科软科技股份有限公司联合主办的 2023中国软件技术大会 于北京成功举办 本届大会以 大模型驱动下的软件变革 为主题 数十位来自知名互联网公司和软件巨头企业的技术大咖 不同领域行业专家 畅销书作者等分享嘉宾
  • 在 Python 中实现 List 抽象

    在 Python 中 创建一个包含多个对象的 list 很常见 例如 对于一组具有相同功能的对象 比如播放声音 希望能够使用类似 my list play 的语法来触发 list 中所有对象的 play 方法 另一个例子是 当希望关闭 li
  • Eggplant—HMI自动化测试软件

    产品概述 Eggplant是英国TestPlant公司推出的创新性自动化测试工具 通过VNC或RDP通讯技术远程桌面连接被测对象 基于图像和文字识别算法进行对象定位 进而驱动和确认被测HMI设备的响应 能够实现自动化的HMI操作测试 较大提
  • SAP ERP系统是什么?SAP好用吗?

    A公司是一家传统制造企业 公司曾先后使用过数个管理软件系统 但各部门使用的软件都是单独功能 导致企业日常管理中数据流与信息流相对独立 形成了 信息孤岛 随着公司近年业务规模的快速发展以及客户数量的迅速增加 企业原有的信息系统在销售预测及生产
  • Java开发中不要使用受检异常

    简介 Java是唯一 主流 实现了受检异常概念的编程语言 一开始 受检异常就是争议的焦点 在当时被视为一种创新概念 Java于1996年推出 如今却被视不良实践 本文要讨论Java中非受检异常和受检异常的动机以及它们优缺点 与大多数关注这个
  • Winform中设置程序开机自启动(修改注册表和配置自启动快捷方式)

    场景 winform程序需要在启动时自启动 可通过将exe快捷方式添加到自启动目录下 或者通过修改注册表添加启动项的方式 注 博客 霸道流氓气质 CSDN博客 实现 使用添加快捷方式到启动目录的方式 Windows下怎样使用bat设置Red
  • 服务器中E5和I9的区别是什么,如何选择合适的配置

    随着科技的进步 服务器处理器的性能在不断攀升 其中 Intel的E5和I9系列处理器在业界具有广泛的影响力 而当我们在选择服务器的时候会有各种各样的配置让我们眼花缭乱不知道该怎么去选择 下面我跟大家分享一下E5跟I9有什么区别 方便我们在选
  • 如何应对Android面试官-> 玩转 ViewPager 懒加载

    前言 ViewPager 缓存页面与预加载机制 通常我们 ViewPager 在使用的是一般都是结合 Fragment 一起使用 我们先来搭一个简单的使用界面 最终搭建出来的效果如下 简单的 ViewPager Fragment 的实现 比
  • 项目文章 | IF=8.4&转录因子Egr-1是脑膜炎型大肠杆菌引起的血脑屏障损伤的关键调节因子

    2024年1月17日华中农业大学动科动医学院陈焕春院士 王湘如教授团队在期刊 Cell Communication and Signaling IF 8 4 发表了题为 Egr 1 is a key regulator of the blo
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路
  • 软件测试/测试开发|给你剖析闭包与装饰器的魔力

    测试管理班是专门面向测试与质量管理人员的一门课程 通过提升从业人员的团队管理 项目管理 绩效管理 沟通管理等方面的能力 使测试管理人员可以更好的带领团队 项目以及公司获得更快的成长 提供 1v1 私教指导 BAT 级别的测试管理大咖量身打造
  • Vue中下载不同文件常用的方式

    1 使用window open方法下载文件
  • Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

    文章目录 摘要 1 问题的提出 引出当前研究的不足与问题 KGC方法 LLM幻觉现象 解决方案 2 数据集和模型构建
  • 题解 | #每个创作者每月的涨粉率及截止当前的总粉丝量#

    提前实习把工作实习没了 提前实习把工作实习没了 提前实习把工作实习没了 学校导师个人主页挂了我的牛客经验贴 接一下自己去年的好运 求求oc真的磕头了 来个offer 明天发offer 心想事成 跨行 转技术岗进大厂的好机会 来看 up 提前
  • 带你读论文第四期:顶会文章来了!来听山东大学博士怎么提升MLLMs

    Datawhale干货 来源 WhalePaper 负责人 芙蕖 WhalePaper简介 由 Datawhale团队成员 发起 对目前学术论文中比较成熟的 Topic 和开源方案进行分享 通过一起阅读 分享论文学习的方式帮助大家 更好地
  • 题解 | #单链表的排序——c语言版本的归并排序#

    姗姗来迟的2023年度总结 华为纯纯恶心 许愿贴 许愿贴 希望兴业总行早日发起面试 求求兴业总行早日给我个offer 1月请赐我力量 许愿 求offer 成功上岸 26届简历求锐评 今年就到大二下了 最近也有按照自己的安排投简历 面试了几次
  • 光波导结构

    摘要 增强现实和混合现实 AR MR 领域的新应用引起了人们对带有光栅区域的光波导系统的越来越多的关注 这些光波导系统用于输入和输出耦合以及扩瞳目的 VirtualLab Fusion为这类系统的仿真和设计提供了几个强大的工具 其中一个是具
  • 【安全】mybatis中#{}和${}导致sql注入问题及解决办法

    0 问题 使用mybatis的时候遇到了 和 可能导致sql注入的问题 1 预先了解 1 底层通过prepareStatement对当前传入的sql进行了预编译 一个 被解析为一个参数占位符 解析之后会将String类型的数据自动加上引号