用 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

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired