用 like concat 不用 like,为了防止sql注入;#{}和${}的区别和用法;#{}预防SQL注入的原理

2024-08-28 17:04

本文主要是介绍用 like concat 不用 like,为了防止sql注入;#{}和${}的区别和用法;#{}预防SQL注入的原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、like concat 和 like

mybatis中为了防止sql注入,使用like语句时并不是直接使用,而是使用concat函数<if test="goodName != null  and goodName != ''"> and good_name like concat('%', #{goodName}, '%')</if>
concat()函数1、功能:将多个字符串连接成成一个字符串。2、语法:concat(str1, str2,)说明:返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null

二、#{}是会加上双引号,而${}匹配的是真实的值

#{}匹配的是一个占位符,相当于JDBC中的一个?,会对一些敏感的字符进行过滤,编译过后会对传递的值加上双引号,因此可以防止SQL注入问题。$ {}匹配的是真实传递的值,传递过后,会与sql语句进行字符串拼接。$ {}会与其他sql进行字符串拼接,不能预防sql注入问题。

2.1 用 #,入参 {“name”:“124”} , 打出的sql日志加上双引号 good_name = ‘123’

  <select id="getGoods" resultMap="BaseResultMap">selectid,good_name,good_code,storage,goodstype,count,remark,target_value,target_value_string,target_big,data_status,brand_code,send_timefrom goodswhere data_status = '0'<if test="name !=null and name !=''">and good_name = #{name}</if></select>
select* from goods where data_status = '0' and good_name = '123'

2.2 用 $,入参 {“name”:“124”} , 打出的sql日志,直接传递 good_name =123 会报错的**

 <select id="getGoods" resultMap="BaseResultMap">selectid,good_name,good_code,storage,goodstype,count,remark,target_value,target_value_string,target_big,data_status,brand_code,send_timefrom goodswhere data_status = '0'<if test="name !=null and name !=''">and good_name = ${name}</if></select>-- 报错的,good_name 字段是varchar类型,传整型 123 肯定报错。
select* from goods where data_status = '0' and good_name = 123如果 {"name":"null"} ,打出的日志:select* from goods where data_status = '0' and good_name = null ; 什么结果都查不出如果入参是  {"name":"null or 1=1"} 
select*from goods g  where data_status = '0' and good_name = null or 1=1; 就能查出所有数据了,sql注入风险如果是 delete from user  goods  where data_status = '0' and good_name = null or 1=1,那就删除所有数据了

2.3 ${} 的使用场景

$ {}也有用武之地,我们都知道${}会产生字符串拼接,来生成一个新的字符串。例如现在要进行模糊查询,查询user表中姓张的所有员工的信息。sql语句为:select * from user where name like '张%'此时如果传入的参数是 “张”
如果使用$ {}:select * from user where name like '${value}%'生成的sql语句:select * from user where name like '张%'如果使用#{}:select * from user where name like #{value}"%"生成的sql语句:select * from user where name like '张'"%"如果传入的参数是 “张%”
使用#{}:select * from user where name like #{value}生成的sql语句:select * from user where name like '张%'使用$ {}:select * from user where name like '${value}'生成的sql语句:select * from user where name like '张%'

在这里插入图片描述

sql日志:       select*from userselect*from user

2.4 #{}能够预防SQL注入的原理

MyBatis的#{}之所以能够预防SQL注入是因为底层使用了PreparedStatement类的setString()方法来设置参数,此方法会获取传递进来的参数的每个字符,然后进行循环对比,如果发现有敏感字符(如:单引号、双引号等),则会在前面加上一个’/'代表转义此符号,让其变为一个普通的字符串,不参与SQL语句的生成,达到防止SQL注入的效果。

2.5 #{}和${}用法总结

其次${}本身设计的初衷就是为了参与SQL语句的语法生成,自然而然会导致SQL注入的问题(不会考虑字符过滤问题)。

(1)#{}在使用时,会根据传递进来的值来选择是否加上双引号,因此我们传递参数的时候一般都是直接传递,不用加双引号,${}则不会,我们需要手动加

(2)在传递一个参数时,我们说了#{}中可以写任意的值, 则必须使用 v a l u e ;即: {}则必须使用value;即: 则必须使用value;即:{value}

(3)#{}针对SQL注入进行了字符过滤,${}则只是作为普通传值,并没有考虑到这些问题

(4)#{}的应用场景是为给SQL语句的where字句传递条件值,${}的应用场景是为了传递一些需要参与SQL语句语法生成的值。

参考:https://blog.csdn.net/Bb15070047748/article/details/107188167

这篇关于用 like concat 不用 like,为了防止sql注入;#{}和${}的区别和用法;#{}预防SQL注入的原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115362

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、