当前位置: 首页 > news >正文

【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并不能很好解决这种注入漏洞

相关文章:

  • Terraform实战(三)-在AWS上尝试Terraform的Vault Provider
  • MySQL用心总结
  • Linux嵌入式开发+驱动开发-中断
  • Kylin系统下Qt的各种中文问题解决思路
  • 力扣刷题之旅:进阶篇(三)
  • 【原创】MQTT开发笔记(四)- 压力测试
  • 单片机基础入门:简单介绍51单片机的工作原理
  • 【原创 附源码】Flutter海外登录--Tiktok登录最详细流程
  • [论文总结] 深度学习在农业领域应用论文笔记12
  • 第十七篇【传奇开心果系列】Python的OpenCV库技术点案例示例:自适应阈值二值化处理图像提取文字
  • vue3 之 商城项目—一级分类
  • Python编写远程控制工具--被控端的编写
  • 哈工大团队顶刊发布!由单偏心电机驱动的爬行机器人实现多方向运动传递
  • DDoS攻击激增,分享高效可靠的DDoS防御方案
  • 使用Arcgis裁剪
  • [nginx文档翻译系列] 控制nginx
  • Java 网络编程(2):UDP 的使用
  • Java,console输出实时的转向GUI textbox
  • JS变量作用域
  • oschina
  • OSS Web直传 (文件图片)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python爬虫--- 1.3 BS4库的解析器
  • SQLServer插入数据
  • Vue2.x学习三:事件处理生命周期钩子
  • WePY 在小程序性能调优上做出的探究
  • 半理解系列--Promise的进化史
  • 工作中总结前端开发流程--vue项目
  • 码农张的Bug人生 - 见面之礼
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # centos7下FFmpeg环境部署记录
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (3)nginx 配置(nginx.conf)
  • (4.10~4.16)
  • (翻译)terry crowley: 写给程序员
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)可以带来幸福的一本书
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)虚函数剖析
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .“空心村”成因分析及解决对策122344
  • .gitignore
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net FrameWork总结
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET处理HTTP请求
  • .NET实现之(自动更新)