关于mybatis使用${}时sql注入的问题
作者:ZS-Oliver 发布时间:2023-04-18 03:29:40
mybatis使用${}时sql注入的问题
最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险。
ORDER BY ${orderBy}
很简单的一个排序字段,但是因为使用 ${} 占位符的原因,有sql注入的风险,相信大家平时也经常会使用这个占位符,不知道有没有考虑sql注入的问题,下面简单介绍下 #{} 和 ${} 的区别以及为什么使用 ${} 会有sql注入的问题。
区别
#{}是一个参数占位符,对于String类型会自动加上"",其他类型不加。由于Mybatis采用预编译,其后的参数不会再进行SQL编译,所以一定程度上防止SQL注入。
${}是一个简单的String替换,字符串是什么,解析就是什么。
类如order by。假如前端传的参数是id(假设id是String类型),对于order by #{id},对应的sql语句就是 order by “id”;对于order by ${id},对应的sql语句则是order by id。这种情况,当用户传参为id && 1=1 的时候,就会产生难以预计的后果。
解决方法
在原实体类里加入一个map
public Map<String,String> indexMap=new HashMap<String,String>(){
{
put("spaceId","space_id"); // key为前端传的值,value为数据库对应的列值
put("optTime","opt_time");
}
};
当传参时,判断参数是否在map的key中,如果存在的话,就把对应的value作为排序的依赖条件。
if(paramOptLog.getOrderBy()!=null &&Strings.isNullOrEmpty(paramOptLog.getOrderBy())){
OptLog optLog=new OptLog();
paramOptLog.setOrderBy(optLog.indexMap.getOrDefault(paramOptLog.getOrderBy(), "id"));
}
List<OptLog> list = optLogMapper.query4Page(paramOptLog);
}
总结就是通过映射,由程序员来决定 ${} 传的参数,即将动态sql转成静态sql的方式可以解决这个问题,这样在实际调用的时候就不会有sql注入的风险了。
mybatis sql注入问题之$与#
在mybatis中使用$符号
不会进行预编译,会被sql注入
注入方式如下:
密码随便输一个就可以通过验证,只要用户名正确即可。
这样输入后查询语句在数据库中如下:
select id,username,password from userLogin where username='admin' OR 1=1 and password='23'
sql解释:AND优先级高于OR 首先判断后面1=1 and password='23'为false,然后判断前面username='admin'为true中间
连接为OR即最后为true OR false 最后还是为true,就直接通过验证,能够正常登陆admin用户。
在mybatis中使用#符号
这样会进行预编译,能够防止sql注入。sql注入只有在编译时才有效,而预编译的时候是用个?代替参数,真正执行时才把参数替换?。
来源:https://blog.csdn.net/qq_37048804/article/details/99614005


猜你喜欢
- Android TimePicker 直接输入的问题解决方案TimePicker 提供了上下的按钮,点击按钮,相关操作都是正常的。但是如果直
- Unity中的RegisterPlugins实用案例在Unity游戏开发中,我们经常需要使用第三方插件来实现一些特定的功能。为了让这些插件能
- 文件的重命名与移动操作有时候为了对文件进行统一访问与管理,需要把文件进行重命名,并移动到新的文件夹,如何实现呢?一枚简单的java小程序即可
- mybatis plus新增(insert)数据获取主键id在我们执行insert操作的时候,往往会需要拿到新插入数据的主键id做下一步操作
- 根据用户系统时区动态展示时间当我们使用SpringBoot+Mysql开发系统时,总是统一设置UTC+8时区,这样用户在任何地区访问系统,展
- 题目:Binary Tree Maximum Path SumGiven a binary tree, find the maximum p
- 前言毕业季来临,很多小伙伴在忙于考公或者准备研究生复试等工作,因此从网上下载或者购买了源码。源码在本地运行成功之后,想要稍微修改一下,结果发
- 前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言。啥意思,就是 英、中、法、德、日。。。语言随意切
- 前言说到 ADB 大家应该都不陌生,即 Android Debug Bridge,Android调试桥,身为 Android 开发的我们,熟
- 在上一篇笔记 《SpringMVC实现图片上传》记录了将图片上传到本地的实现,在很多项目中都会有一台专门的文件服务器来保存文件的,这边记录下
- 近期工作内容需要涉及到相机开发,其中一个功能点就是实现一个相机预览页底部的滑动指示器,现在整理出来供大家讨论参考。先上一张图看下效果:主要实
- SpringBoot JPA分页查询指定列并返回指定实体用习惯Mybatis,没用过jpa 真是各种踩坑了脑壳疼,一个分页弄老半天,原来就一
- 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程。基本原理通用 Mapper 提供了一些通用的方法,这些通用方
- 本文实例讲述了Android中ProgressBar用法。分享给大家供大家参考,具体如下:在android中会经常用到ProgressBar
- 一、PriorityQueue的数据结构JDK7中PriorityQueue(优先级队列)的数据结构是二叉堆。准确的说是一个最小堆。二叉堆是
- 在使用C#进行相关编程的时候,有时候我们需要获取系统相关的进程信息。那么在C#中如何获取系统的所有进程那?下面请跟小编一起来操作。1、首先新
- 本文实例讲述了C#实现用于操作wav声音文件的类。分享给大家供大家参考。具体如下:有了这个C#类,我们可以很轻易的调用本地wav文件进行同步
- HashMap的keySet()方法比较简单,作用是获取HashMap中的key的集合。虽然这个方法十分简单,似乎没有什么可供分析的,但真正
- 一个比较常见的改进用户体验的方案是用Redo/Undo来取代确认对话框,由于这个功能比较常用,本文简单的给了一个在C#中通过Command模
- 一、来源项目中遇到混合动画的情况,每次实现都需要生命一堆属性,让代码变得杂乱,难以维护。参考 iOS 组动画 CAAimationGroup