从程序被SQL注入来MyBatis 再谈 #{} 与 ${} 的区别

news2024/11/16 13:28:03

缘由

最近在的一个项目上面,发现有人在给我搞 SQL 注入,我真的想说我那么点资源测试用的阿里云服务器,个人估计哈,估计能抗住他的请求。狗头.png

系统上面的截图
系统上面的截图

数据库截图
数据库截图

说句实在的,看到这个之后我立马就是在想啊,现在我们都是用的成熟的ORM 框架,一般调用 ORM 框架的方法操作数据库是不会有问题的。

后面又让我想起来了,#{}${} 的区别,这里总结下,说一句通俗易懂的话:使用 #{} 可以防止SQL注入,使用 ${} 就会出现 SQL 注入。

代码理解

咱们都是程序员,都喜欢说,别给我说那么多废话,show me the code,那么我们直接看代码把,我们通过伪代码来理解下:

 public void test(String name, String id){
     String sql = "update orders set name = "+name+" where id = ?";
 }

这里我为了方便与说明,就是使用上面的一个SQL 来解析,从上面的 SQL 可以看到两点信息:

  • name: 是直接使用了拼接字符串的方式,这里就是类似于 ${} 做的事情
  • id:使用了 ? 做为占位符,做了一次预处理,先去编译SQL,后面再来做参数化操作,这个是 #{} 的具体原理

如果是 name 被恶意传入了 SQL 代码,比如:

") OR (SELECT*FROM(SELECT(SLEEP(3)))hnao) limit 1#
-- 或者
" union select 1-- 

那么解析出来的 SQL 就会变成:


update orders set name = ) OR (SELECT*FROM(SELECT(SLEEP(3)))hnao) limit 1

update orders set name = union select 1

虽然上面比较难看,因为我这里举例是 update,如果是查询呢:

select name from orders  union select 1-- 

那这样子是不是就出问题了?其实只要他成功一次,那么就可能窃取到我们数据库的信息了。

#{}${} 的区别

这里我也去百度了下,然后整理一下大致的区别,在 MyBatis 中,#{}${} 都是用于在 SQL 语句中插入参数的占位符,但它们之间有着显著的区别。

  1. 预编译与安全性

    • #{}:这是一个预编译(PreparedStatement)的占位符。当 MyBatis 在解析 XML 映射文件或注解中的 SQL 时,它会为 #{} 中的参数生成一个 PreparedStatement,并使用 ? 作为占位符。这意味着 SQL 语句会被预编译,并且在执行时会使用参数化查询,这样可以防止 SQL 注入攻击。
    • ${}:这是一个简单的字符串替换。MyBatis 会直接替换 ${} 中的内容为 SQL 语句中的相应部分。这意味着 SQL 语句不会被预编译,而是会动态地构建和执行。这可能会导致 SQL 注入攻击,因为它允许不受限制的字符串替换。
  2. 用法

    • #{}:通常用于插入参数值,例如列值、条件值等。
    • ${}:通常用于插入 SQL 片段,如表名、列名、动态 SQL 语句等。
  3. 动态 SQL

    • 在 MyBatis 中,${} 更多地用于构建动态 SQL,因为它允许直接替换 SQL 语句中的任何部分。然而,由于这种灵活性,它也增加了 SQL 注入的风险。
    • #{} 在动态 SQL 中通常用于插入参数值,以确保安全性。
  4. 类型处理器

    • 对于 #{} 插入的参数,MyBatis 会使用相应的类型处理器(Type Handler)来确保参数与数据库中的列类型匹配,并进行必要的类型转换。
    • 而对于 ${},由于它直接替换 SQL 语句中的部分,因此不会使用类型处理器。
  5. 注意事项

    • 尽可能使用 #{} 来插入参数值,以确保 SQL 语句的安全性和性能。
    • 如果确实需要使用 ${}(例如,插入表名或列名),请确保传入的字符串是安全的,并且不包含任何来自不受信任的来源的内容。
    • 在使用动态 SQL 时,要特别注意 SQL 注入的风险,并采取相应的预防措施。

总之,#{}${} 在 MyBatis 中各有其用途,但 #{} 通常更安全、更可靠,并应优先使用。

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

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

相关文章

架构师系列-定时任务解决方案

定时任务概述 在很多应用中我们都是需要执行一些定时任务的,比如定时发送短信,定时统计数据,在实际使用中我们使用什么定时任务框架来实现我们的业务,定时任务使用中会遇到哪些坑,如何最大化的提高定时任务的性能。 我…

设计模式深度解析:分布式与中心化,IT界两大巨头“华山论剑”

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨IT界的两大巨头交锋✨ 👋 在IT界的广阔天地中,有两座…

【Linux 网络】网络基础(三)(网络层协议:IP 协议)

在复杂的网络环境中确定一个合适的路径。 一、TCP 与 IP 的关系 IP 层的核心作用是定位主机,具有将数据从主机 A 发送到主机 B 的能力,但是能力并不能保证一定能够做到,所以这时就需要 TCP 起作用了,TCP 可以通过超时重传、拥塞控…

DBAPI怎么进行数据格式转换

DBAPI如何进行数据格式的转换 假设现在有个API,根据学生id查询学生信息,访问API查看数据格式如下 {"data":[{"name":"Michale","phone_number":null,"id":77,"age":55}],"msg"…

JVM学习-Class文件结构②

访问标识(access_flag) 在常量池后,紧跟着访问标记,标记使用两个字节表示,用于识别一些类或接口层次的访问信息,包括这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果…

[vue error] vue3中使用同名简写报错 ‘v-bind‘ directives require an attribute value

错误详情 错误信息 ‘v-bind’ directives require an attribute value.eslintvue/valid-v-bind 错误原因 默认情况下,ESLint 将同名缩写视为错误。此外,Volar 扩展可能需要更新以支持 Vue 3.4 中的新语法。 解决方案 更新 Volar 扩展 安装或更新 …

Java 泛型基础

目录 1. 为什么使用泛型 2. 泛型的使用方式 2.1. 泛型类 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符号 3.1. 类型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符?的区别。 4. 泛型不变性 5. 泛型编译时擦除 1. 为什么使用泛型 Java 为…

Django 里的静态资源调用

静态资源:图片,CSS, JavaScript 一共有两种方法 第一种方法 在项目的文件夹里创建名为 static 文件夹 在该文件夹里,添加静态资源 在 settings.py 里添加路径 import os# Static files (CSS, JavaScript, Images) # https://docs.djan…

Git基础命令:带图整理

基础命令 Git 安装 Git下载地址 https://git-scm.com/downloads Git安装(Window/Mac) 选择不同系统安装包安装 检验是否安装成功 出现Git Bash命令行工具或Git GUI工具git --version 查看git安装版本 Git 结构 工作区(Working Direct…

干货收藏 | 掌握ChatGPT提示词的精髓:从小白到高手!!

前言 提示决定了 ChatGPT 的输出。也就是说:GPT 生成的答案质量,完全取决于你“问它”,以及“引导它”的方式,如果你能问得好,引导的好,那么它就会帮你生成让你惊喜的答案,反之则无价值&#x…

国际版Tiktok抖音运营流量实战班:账号定位/作品发布/热门推送/等等-13节

课程目录 1-tiktok账号定位 1.mp4 2-tiktok作品发布技巧 1.mp4 3-tiktok数据功能如何开通 1.mp4 4-tiktok热门视频推送机制 1.mp4 5-如何发现热门视频 1.mp4 6-如何发现热门音乐 1.mp4 7-如何寻找热门标签 1.mp4 8-如何寻找垂直热门视频 1.mp4 9-如何发现热门挑战赛 1…

从垃圾识别到收集器:详细聊聊Java的GC

个人博客 从垃圾识别到收集器:详细聊聊Java的GC | iwts’s blog 前言 聊GC,自然离不开JVM内存模型,建议先了解JVM内存模型相关内容,或者最起码了解堆相关的内容,GC主要处理的就是堆。 这里会从垃圾识别算法->GC算法->JV…

OWASP top10--SQL注入(二)

目录 06:SQL注入提交方式 6.1、get提交 6.2、post提交 6.3、cookie提交 6.4、HTTP Header头提交 07:注入攻击支持类型 7.1、union注入: 7.1.1、union操作符一般与order by语句配合使用 7.1.2、information_schema注入 7.2、基于函数…

【云原生--K8S】K8S python接口研究

文章目录 前言一、搭建ubuntu运行环境1.运行ubuntu容器2.拷贝kubeconfig文件二、python程序获取k8s信息1.获取node信息2.获取svc信息3.常用kubernetes API总结前言 在前面的文章中我们都是通过kubectl命令行来访问操作K8S,但是在实际应用中可能需要提供更方便操作的图形化界面…

数据结构和算法|排序算法系列(二)|冒泡排序

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知: 《Hello算法之排序算法》 主要内容来自:Hello算法11.3 冒泡排序 我觉得冒泡排序非常有意思,也非常简单,就是不停地交换相邻的元素即可&#…

c语言IO

前言 老是忘记c语言IO操作,故写个文章记录一下 打开文件 fopen FILE *fopen(const char *path, const char *mode);mode 返回值 如果文件成功打开,fopen 返回一个指向 FILE 结构的指针。如果文件打开失败(例如,因为文件不存…

SERVER ——查询(二)

目录 5. top 6. null 7. order by 8. 模糊查询: 9. 聚合函数 5. top top查询:查询表的前几行;下面是代码演示: --top(前面的几个记录) select top 2 * from emp; --查询表的前两列 select top 20 percent *…

解密论文评审过程:SCI论文是匿名送审的吗?

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 前几天有位学员问我,审稿人能看见我论文的作者和单位信息吗?应该是双方都匿名才更公平啊。 同行评议,在不同的期刊操作还真不一样。有双方…

python数据分析——数据可视化(图形绘制)

数据可视化(图形绘制基础) 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制scatter()示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线…

代码随想录|Day55|动态规划 part15|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 class Solution: def isSubsequence(self, s: str, t: str) -> bool: dp [[0] * (len(t) 1) for _ in range(len(s) 1)] for i in range(1, len(s) 1): for j in range(1, len(t) 1): if s[i - 1] t[j - 1]: dp[i][j] dp[i - 1][j - 1] 1 else: dp[i…