关于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
猜你喜欢
- 1.BeanFactory1.1Spring提供了IOC容器的两种实现方式① BeanFactory:IOC容器的基本实现,是Spring内
- ArrayList和LinkedList区别、扩容机制及底层实现ArrayListArrayList的底层实现为数组存储在内存中,线程不同步
- 问题背景: 我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该
- 一. 封装封装是面向对象的三大特性之一;面向对象程序三大特性:封装、继承、多态 。封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和
- 本文实例为大家分享了Android实现支付宝支付密码输入界面的具体代码,供大家参考,具体内容如下效果图:主要代码:import java.u
- 前言作为一个写java的使用最多的轻量级框架莫过于spring,不管是老项目用到的springmvc,还是现在流行的springboot,都
- Java 字符串反转问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路
- 由于最近公司在开发一款后台与安卓的更新系统,经过再三研究之后,也是选择Mqtt这个目前流行的框架。为了能够让项目运营起来,最终虽说是选择Ac
- 1、this关键字首先需要提醒的是,在整个Java之中,this是最麻烦的一个关键字,只要是代码开发,几乎都离不开this。在Java中th
- ShardingSphere的路由引擎类型本篇文章源码基于4.0.1版本上篇文章我们了解到了ShardingSphere在路由流程过程中,根
- String password = RandomUtil.generateString(10);源码如下:package com.javan
- JenkinsJenkins是一个开源的、可扩展的持续集成、交付、部署的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台
- Java自定义注解一般使用场景为:自定义注解+ * 或者AOP,使用自定义注解来自己设计框架,使得代码看起来非常优雅。本文将先从自定义注解的
- 1.内部类概念及分类将一个类定义在另一个类的内部或者接口内部或者方法体内部,这个类就被称为内部类,我们不妨将内部类所在的类称为外围类,除了定
- 在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统
- SharedPreferences介绍:SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置
- session对象用于在会话范围内,记录每个客户端的访问状态,以便于跟踪每个客户端的操作状态,在会话存储的信息,在浏览器发出后续请求时可以获
- 本文主要介绍了Spring Security OAuth2 实现登录互踢的示例代码,分享给大家,具体如下:背景说明一个账号只能一处登录,类似
- <%@ page language="java" contentType="text/html; cha
- 1. 概述官方JavaDocsApi: javax.swing.JTextAreaJTextArea,文本区域。JTextArea 用来编辑