# 和 $ 的区别②

news/2024/4/19 19:32:55/

上节博客说了使用 # 的时候,如果参数为 String ,会自动加上单引号

但是当参数为String 类型的时候,也有不需要加单引号的情况,这时候用 # 那就会出问题

比如根据 升序(asc) 或者 降序(desc) 查找的时候,加了单引号那就会报错

这个时候我们就只能使用 $ 

如果看不懂代码,就去看<<Mybatis 的操作(结合上文)续集>>,我这里为了简练一点就不多解释了

@Select("select * from userinfo order by id ${sort}")List<UserInfo> selectUserBySort(String sort);
 @Testvoid selectUserBySort() {log.info(userInfoMapper.selectUserBySort("asc").toString());}

使用 $ 才能正常运行 

还有一种情况不能使用 # ,那就是模糊查询 

进行模糊查询的时候也只能用 $

@Select("select * from userinfo where username like'%${username}%'")List<UserInfo> selectUserByLike(String username);
@Testvoid selectUserByLike() {log.info(userInfoMapper.selectUserByLike("java").toString());}

 有的人可能会觉得那我们在排序和模糊查询的时候使用 $ ,其他有需要引号的情况只要拼接上引号也可以使用 $ ,那我们就不用 # 了吗?

这是不可以滴,因为 $ 存在 SQL 注入的问题

打个比方 : 

select * from userinfo where username = 'admin';

若是此时把admin换成 'or 1='1  ,那就变成了

select * from userinfo where username = ''or 1='1';

(这样前面两个引号就会形成一对,后面两个引号形成一对,这就导致where后面的搜索条件变成username=0或者1=1,因为1=1肯定恒成立,这样运行出来的结果就是搜索到全部数据,这与我们的想法背道而驰)

那这肯定就不对了呀,这就是 SQL 注入

# 就不会存在 SQL 注入的问题

我们用代码进行验证看看,先验证 $

    @Select("select * from userInfo where username = '${username}'")List<UserInfo> selectByName(String username);
  @Testvoid selectByName() {log.info(userInfoMapper.selectByName("'or 1='1").toString());}

 很明显把所有数据都给查出来了,这是错误的

接下来我们试试 #

@Select("select * from userInfo where username = #{username}")List<UserInfo> selectByName(String username);
 @Testvoid selectByName() {log.info(userInfoMapper.selectByName("'or 1='1").toString());}

因为没有名为 'or 1='1 的数据,所以啥也没查出来,没问题

同样是加引号,为什么# 不会发生SQL注入的问题?

SQL 执行的过程为 : 1.语法解析 2.SQL优化 3.SQL编译

然后呢, # 是预编译SQL,将编译一次之后的SQL语句缓存起来了,后面再次执行的时候,省去了解析优化等过程,提高了效率,预编译SQL也可以说是一个模版,往里套数据就行.

比如 select * from userinfo where username = '_____';

预编译SQL就只给你留下了这个位置,你填进去之后就只能是 username 的参数

而即时SQL就是你传的参数是什么就现场进行拼接,拼出来之后再对这条语句进行上面三个过程

所以这就是为什么 # 不会发生 SQL 注入的原因

但是在进行排序的时候,只能使用 $ 的时候,发生SQL注入怎么办呢?

可以进行参数校验,只要不是 asc 和 desc 就不接收这个请求

模糊查询的时候使用Mysql的内置函数

 

@Select("select * from userinfo where username like CONCAT('%',#{username},'%')")List<UserInfo> selectUserByLike(String username);
 @Testvoid selectUserByLike() {log.info(userInfoMapper.selectUserByLike("java").toString());}

 


http://www.ppmy.cn/news/1269912.html

相关文章

Nginx 服务器安装及配置文件详解

1. 安装nginx 1.1 选择稳定版本 我们编译安装nginx来定制自己的模块&#xff0c;机器CentOS 6.2 x86_64。首先安装缺少的依赖包&#xff1a; # yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 这些软件包如果yum上没有的话…

数据仓库相关概念

目录 实时数仓和离线数仓 数仓分层 ETL&#xff08;Extract-Transform-Load&#xff09; 数仓指标 一些缩写 实时数仓和离线数仓 离线数仓和实时数仓主要的区别在于数据处理和更新的速度。 离线数仓&#xff1a;离线数仓通常处理的是历史数据&#xff0c;这些数据一般是批…

Java通过documents4j和libreoffice把word转为pdf

文章目录 word转pdf的相关第三方jar说明Linux系统安装LibreOffice在线安装离线安装word转pdf验证 Java工具类代码 word转pdf的相关第三方jar说明 docx4j 免费开源、稍微复杂点的word&#xff0c;样式完全乱了&#xff0c;且xalan升级为2.7.3后会报错。poi 免费开源、官方文档少…

100:ReconFusion: 3D Reconstruction with Diffusion Priors

简介 官网 少样本重建必然导致nerf失败&#xff0c;论文提出使用diffusion模型来解决这一问题。从上图不难看出&#xff0c;论文一步步提升视角数量&#xff0c;逐步与Zip-NeRF对比。 实现流程 Diffusion Model for Novel View Synthesis 给定一组输入图像 x o b s { x i…

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

GAN的原理分析与实例

为了便于理解&#xff0c;可以先玩一玩这个网站&#xff1a;GAN Lab: Play with Generative Adversarial Networks in Your Browser! GAN的本质&#xff1a;枯叶蝶和鸟。生成器的目标&#xff1a;让枯叶蝶进化&#xff0c;变得像枯叶&#xff0c;不被鸟准确识别。判别器的目标&…

使用VBA快速统计词组词频(多单词组合)(2/2)

实例需求&#xff1a;产品清单如A列所示&#xff0c;现在如下统计多单词组合词组词频。 在上一篇博客中《使用VBA快速统计词组词频(多单词组合)&#xff08;1/2&#xff09;》讲解了如何实现双词的词频统计。 本文将讲解如何实现3词的词频统计&#xff0c;掌握实现方法之后&a…

java-sec-code的xss

java-sec-code 用于学习java漏洞代码 环境部署 直接在idea中使用git 运行即可 RequestMapping("/reflect") ResponseBody public static String reflect(String xss) {return xss;}当用户访问到/reflect URL地址时&#xff0c;程序会自动调用reflect方法&#xff0c…

19 高速列车场景下3Gpp 5G NR的DMRS设计与评估

文章目录 解决问题设计DMRS仿真参数仿真结果 解决问题 多普勒/扩展影响十分显著&#xff0c;设计用于信道估计时&#xff0c;需要考虑解调参考信号&#xff0c;5G用DMRS结构而不是CRS结构&#xff0c;因此需要为高速UE设计DMRS结构&#xff0c;DMRS设计是为了提高信道估计并减…

流程控制之条件判断

目录 流程控制之条件判断 2.1.if语句语法 2.1.1单分支结构 2.1.2双分支结构 2.1.3多分支结构 2.2.案例 例一: 例2: 例3: 例4: 例5: 例6: 例7: 例8: 例9: 2.3.case多条件判断 2.3.1.格式 2.3.2.执行过程 例10: 流程控制之条件判断 2.1.if语句语法 2.1.1单分…

外汇天眼:Coinbase国际交易所将启动现货市场

Coinbase宣布了Coinbase国际交易所扩张的下一阶段——退出符合条件客户的非美国现货市场。 这一最新发展旨在满足Coinbase全球用户群体的独特需求和需求&#xff0c;同时强化其扩大国际访问可信产品和服务的战略使命。 Coinbase国际交易所现货交易的推出和扩展将分阶段进行。1…

Pencile - exer

import java.util.HashMap; import java.util.Map;public class TableConverter {public static void main(String[] args) {// 示例输入数据String[] inputData {"line1 col1 A","line2 col3 B","line3 col1 C","line4 col2 D",};//…

vuepress-----25、右侧目录

# 25、vuepress 右侧目录 https://github.com/xuek9900/vuepress-plugin-right-anchor vuepress-plugin-right-anchor English &#xff5c;中文 在用 Vuepress 2.x 编写的文档页面右侧添加 锚点导航栏 # 版本 2.x.x -> Vuepress 2.x -> npm next -> master 分支0…

使用podman管理容器

目录 1.安装及配置podman 2.镜像的命名 3.对镜像重新做标签 4.删除镜像 5.查看镜像的层结构 6.导出和导入镜像 7.创建容器 8.创建一个简单的容器 9.容器的生命周期 10.创建临时容器 11.指定容器中运行的命令 12.创建容器时使用变量 对于初学者来说&#xff0c;不太容易理…

idea插件开发报错: ZipException opening “slf4j.jar“: zip END header not found

错误信息 E:\idea-workspace\#idea-plugin\JSON2Object\src\main\java\com\hgy\plugin\json2object\GenerateAction.java:1: 错误: 无法访问com.hgy.plugin.json2object package com.hgy.plugin.json2object; ^ZipException opening "slf4j.jar": zip END header no…

【科研论文】检索证明、科技查新、查收查引(附教育部、科技部查新工作站名单)

文章目录 1、什么是科技查新 & 查收查引2、科技查新 & 查收查引有什么用3、如何办理科技查新 & 查收查引4、教育部科技查新工作站5、科技部认定的查新机构名单 1、什么是科技查新 & 查收查引 科技查新是国家科技部为避免科研课题重复立项和客观正确地判别科研…

竞赛保研 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

win10 + cmake3.17 + vs2017编译osgearth2.7.0

1. 下载文件并配置安装目录 1.1 下载文件 1&#xff09;osgearth-2.7.02) curl-7.48.03) osg-3.4.14) osg第三方依赖库&#xff1a;3rdParty_VS2017_v141_x64_V11_full.7z5&#xff09;osg示例数据&#xff1a;OpenSceneGraph-Data-3.4.0.zip6&#xff09;cmake-3.177&…

区块链的可扩展性研究【06】Plasma

1.Plasma&#xff1a;Plasma 是一种基于以太坊区块链的 Layer2 扩容方案&#xff0c;它通过建立一个分层结构的区块链网络&#xff0c;将大量的交易放到子链上进行处理&#xff0c;从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易&#xff0c;使得不同的区块…

Spark Paimon 中为什么我指定的分区没有下推

背景 最近在使用 Paimon 的时候遇到了一件很有意思的事情&#xff0c;写的 SQL 居然读取的数据不下推&#xff0c;明明是分区表&#xff0c;但是却全量扫描了。 目前使用的版本信息如下: Spark 3.5.0 Paimon 0.6.0 paimon的建表语句如下&#xff1a; CREATE TABLE table_demo…