当前位置: 首页 > news >正文

【Java--SQL】${}与#{}区别和危害

目录

一区别

二SQL${}注入问题

一区别

在MyBatis中,#{}和${}是两种不同的参数占位符用于在SQL语句中引用变量或参数。它们的区别如下:

1.#{}占位符(预编译):#{}是MyBatis中的预编译占位符,它会把传入的参数值自动进行预编译处理,以防止SQL注入攻击。#{}占位符会将参数值作为一个占位符传递给数据库驱动程序,驱动程序会将其转化为一个预编译的参数并进行安全处理,在执行SQL语句时,会将参数通过参数设置语句传递给数据库。

2.${}占位符(字符串拼接):${}是Mybatis中的字符串拼接占位符,它会直接传入的参数值拼接到SQL语句中。${}占位符会将参数值直接替换到生成的SQL语句中,这种方式比较灵活,可以动态拼接SQL语句的各个部分。

综上所述,#{}占位符提供了更高的安全性,适合用于参数值的传递而${}占位符具有更高的灵活性的,适合用于动态拼接SQL语句的各个部分,在使用占位符时,应根据具体的需求选择合适的方式,并注意参数值的安全。

简单来说#{}就是预编译处理${}是字符替换

预编译处理:是指MyBatis在处理的#{}时,就是把的#{}替换成了?号,使用PreparedStatement的set方法来赋值。也就是说#{}会把{}内的整体看成value,最后再给value加上单引号,重点强调引号内部是一个整体(#{}不会发生SQL注入的根本原因)。

二SQL${}注入问题

xml文件

<mapper namespace="com.caicode.dao.UserDao"><select id="query" resultType="com.caicode.entity.UserEntity">select * from user where sname = '${param1}' and spassword = '${param2}'</select>
</mapper>

 测试代码

public static void main(String[] args) throws IOException {UserEntity userEntity = new UserService().queryOne("lisi","' or 1 = '1");System.out.println("登录状态:"+(userEntity == null?"失败":"成功"));}

 sql最终的结果

select * from user where sname = 'Lisi' and spassword = '' or 1 = '1'

可以看到把符合结果的数据全部查询出来了,总共11条

而正常来说我们的一般输入是这样的

public static void main(String[] args) throws IOException {UserEntity userEntity = new UserService().queryOne("zhangsan","123qwe");System.out.println("登录状态:"+(userEntity == null?"失败":"成功"));}

 这样输入的话,最终的结果是一条。

http://www.lryc.cn/news/576544.html

相关文章:

  • git使用详解和示例
  • ByteMD+CozeAPI+Coze平台Agent+Next搭建AI辅助博客撰写平台(逻辑清楚,推荐!)
  • epitope3D: 精准预测蛋白表面的“抗原决定簇”
  • ABP VNext + 多数据库混合:SQL Server+PostgreSQL+MySQL
  • 【分布式机架感知】分布式机架感知能力的主流存储系统与数据库软件
  • 安卓应用启动页全版本兼容实战:从传统方案到Android 12+ SplashScreen API最佳实践
  • FPGA产品
  • 关于ubuntu 20.04系统安装分区和重复登录无法加载桌面的问题解决
  • KS值:风控模型的“风险照妖镜”
  • 北大肖臻《区块链技术与应用》学习笔记
  • 趣味数据结构之——数组
  • 给定一个整型矩阵map,求最大的矩形区域为1的数量
  • SRS WebRTC 入门
  • 【大模型】Query 改写常见Prompt 模板
  • 第27篇:SELinux安全增强机制深度解析与OpenEuler实践指南
  • uni-app项目实战笔记26--uniapp实现富文本展示
  • 【Actix Web 精要】Rust Web 服务开发核心技术与实战指南
  • [Java 基础]算法
  • 【AI实践】Mac一天熟悉AI模型智能体应用(百炼版)
  • nginx基本使用 linux(mac下的)
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十八) -> 构建HAR
  • 编译安装交叉工具链 riscv-gnu-toolchain
  • RabbitMQ-基础篇
  • FreeSWITCH配置文件解析(2) dialplan 拨号计划中xml 的action解析
  • 1.1 基于Icarus Verilog、ModelSim和Vivado对蜂鸟E203处理器进行仿真
  • 学习使用dotnet-dump工具分析.net内存转储文件(2)
  • YOLOv5 训练中参数优化方案
  • 测量 Linux 中进程上下文切换需要的时间
  • UniApp Vue3 模式下实现页面跳转的全面指南
  • 【C++】简单学——内存管理