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

news2024/11/13 15:25:11

一、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">
        select
        id,
        good_name,
        good_code,
        storage,
        goodstype,
        count,
        remark,
        target_value,
        target_value_string,
        target_big,
        data_status,
        brand_code,
        send_time
        from goods
        where 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">
        select
        id,
        good_name,
        good_code,
        storage,
        goodstype,
        count,
        remark,
        target_value,
        target_value_string,
        target_big,
        data_status,
        brand_code,
        send_time
        from goods
        where 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 user
				select*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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Webbench1.5安装使用Ubuntu

1、安装依赖包 sudo apt-get update sudo apt-get install libtirpc-dev2、安装Webbench1.5 参考https://github.com/baiguo/webbench-1.5 # 可能需要root权限&#xff0c;我是切换到root用户才安装成功 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.…

APP.vue引入子组件进行页面展示

一.将vue项目启动服务器原始页面进行清空 打开APP.vue文件&#xff0c;将<template>标签里的内容和<style>标签里的内容 ctrl/ 选中进行注释&#xff0c;以及引入的Helloworld.vue文件内容代码进行注释 并且 ctrls 保存 服务器页面从原始页面 变为空白 二.在comp…

树莓派4B安装golang最新版(20210520)

前置条件&#xff1a; 树莓派4B 安装官方系统 Linux raspberrypi 5.10.17-v7l #1414 更换最新版的原因&#xff1a; 截至 2021.5.20 &#xff0c;Raspberry Pi OS 最新版系统中&#xff0c;默认安装golang1.11&#xff0c;但是使用 go get golang.org/x/crypto/ssh 时&#xff…

推荐系统实战(七)-多任务多场景(上)多任务

多任务Multi-Task&#xff0c;有时也被称为多目标Multi-Objective建模。比如说电商场景下&#xff0c;希望曝光的物料被多多点击&#xff0c;还希望商品被下单购买&#xff0c;因此同时建模三个目标&#xff1a;曝光到点击CTR&#xff0c;点击到购买转换率CVR&#xff0c;曝光到…

记一次对某佛教系统的漏洞挖掘

前言 简单记录一次漏洞挖掘&#xff0c;一个系统居然爆了这么多类型的洞&#xff0c;于是想记录哈。(比较基础&#xff0c;我是菜狗&#xff0c;大佬轻喷) 业务介绍 是一个某佛教的系统 有一些佛教的学习资源、一些佛教相关的实物商品可购买&#xff0c;有个人中心&#xff…

PyCharm中python语法要求——消去提示波浪线

PyCharm中python语法要求——消去提示波浪线 关闭代码规范检查 在Setting里边搜索pep&#xff0c;取消勾选pep8 coding style violation 问题产生 解决问题 按照下图操作&#xff0c;也可直接CtrlAlts弹出设置页面 在 Settings 中 &#xff1a; Editor > Color Sheame >…

设计模式26-解析器模式

设计模式26-解析器模式 动机定义与结构定义结构 C代码推导代码说明 优缺点应用总结 动机 在软件构建过程中&#xff0c;如果某一特定领域的问题比较复杂&#xff0c;类似结构会不断重复的出现。如果使用普通的编程方式来实现&#xff0c;将面临非常频繁的变化。 在这种情况下&…

二叉树算法算法【二叉树的创建、插入、删除、查找】

一、原理 1.1、二叉排序树的插入 1.2、二叉树的删除 &#xff08;1&#xff09;删除度为0的节点&#xff0c;就是最后的叶子节点&#xff0c;直接删除就可以了. &#xff08;2&#xff09;删除度为1的节点&#xff0c;就是爷爷节点接收孙子节点。 &#xff08;3&#xff09;删…

什么软件可以约束员工摸鱼行为?「5款软件助力企业管控员工上班摸鱼!」

你的企业是否也在面临这些问题&#xff1a; 1.工作效率下降&#xff1a;频繁的分心会打断工作连贯性&#xff0c;降低任务完成的质量和速度。 2.团队协作受损&#xff1a;个别员工的低效可能导致整个团队进度滞后&#xff0c;影响项目按时交付。 3.资源浪费&#xff1a;非工…

Git —— 1、Windows下安装配置git

Git简介 Git 是一个免费的开源分布式版本控制系统&#xff0c;旨在处理从小型到 快速高效的超大型项目。 Git 易于学习&#xff0c;占用空间小&#xff0c;性能快如闪电。 它超越了 Subversion、CVS、Perforce 和 ClearCase 等 SCM 工具 具有 cheap local branching、 方便的暂…

【分布式架构幂等性总结】

文章目录 幂等性什么场景需要幂等设计&#xff1f;产生幂等性的原因解决重复操作&#xff0c;实现幂等性 幂等性 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会因为多次点击而产生了副作用。比如&#xff1a;公交车刷卡&#xff0…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建&#xff0c;发布 2. 利用 BAT 来一键部署…

特效与样式(5)——Timetables的使用

第一次使用timetables做学校课表的开发&#xff0c;里面的门道东西挺多的&#xff0c;比我想的要复杂很多。包括我现在也只是实现了课表的初级效果。 主要是标题部分&#xff0c;数据部分&#xff0c;还有颜色控制部分。每个表格都需要一个控制颜色&#xff0c;每次写数据的时候…

hyperf注解,自定义注解

注解是 Hyperf 非常强大的一项功能&#xff0c;可以通过注解的形式减少很多的配置&#xff0c;以及实现很多非常方便的功能。 结构 建立注解 在app下建立Annotation注解文件夹 在Annotation下建立Jim.php注解 下面的的Annotation 和 Target是全局注解&#xff0c;所以不需…

Go学习笔记(一)语法

标准库文档&#xff1a;Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 B站课程&#xff1a;8小时转职Golang工程师(如果你想低成本学习Go语言) 课程作者语雀&#xff08;首页有更多内容&#xff09;&#xff1a;8小时转职Golang工程师 语雀 代码仓…

C语言基础(二十)

链表是一种常见的数据结构&#xff0c;通常用来存储一系列元素&#xff0c;每个元素由一个节点来表示。在链表中&#xff0c;每个节点包含两部分&#xff1a;数据元素本身和指向下一个节点的指针。这种结构使得链表中的元素在内存中不是连续存储的&#xff0c;而是通过指针连接…

可拖拽表单设计器都有哪些突出特点?

为了提高效率、降低开发成本&#xff0c;利用低代码技术平台的优势特点可以实现这一目标。究竟什么是低代码技术平台&#xff1f;都有哪些值得夸耀的特点和优势&#xff1f;今天&#xff0c;我们就带着这些问题&#xff0c;一起来了解低代码技术平台、可拖拽表单设计器的多个优…

香港站群服务器优势

香港站群服务器因其独特的地理位置和网络连接优势&#xff0c;在SEO优化、网站群管理和网络营销等方面受到广泛关注。其优势主要体现在以下几个方面&#xff0c;rak小编为您整理发布。 地理位置优越 连接亚洲国际市场&#xff1a;香港作为亚太地区的重要经济中心&#xff0c;具…

华为2024年秋招-结构与材料工程师-结构方向-机试题(四套)(每套四十题)

华为2024年招聘-结构与材料工程师-结构方向-机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——结构与材料工程师 岗位意向——结构 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff…

详细了解如何设计和实现一个SSO系统?

一、SSO系统有什么好处&#xff1f; 1、用户角度&#xff1a;一次登录多次使用&#xff0c;无需记录多套用户名和密码&#xff0c;省事省心。 2、系统管理员角度&#xff1a;管理员只需要维护好一个统一的账号中心就可以了&#xff0c;方便 3、新系统开发角度&#xff1a;新系统…