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

【SpringBoot】持久层 sql 注入问题

目录

概述

#{} 与 ${}


概述

        前端恶意传参,改变后端 sql 语句的语法结构,从而使后端给前端返回一些私密的数据。这种安全问题往往是因为没有严格过滤参数,或者后端代码不严谨导致的。

#{} 与 ${}

        在 MyBatis 框架中,#{} 与 ${} 都表示占位符,方便灵活传参。如下代码

@Select("select * from user_info where username= #{name} ")
UserInfo queryByName(String name);

        #{} 使用的是 预编译 sql , ${} 使用的是 及时 sql

        及时 sql :sql 语句要先经过 词法分析,语法分析,语义分析,再把优化后的 sql 喂给数据库执行。

        也就是说,${} 占位符传过来的参数是要参与 sql 语法构建的,如果参数中带有一些 sql 的关键字,会在词法分析时被识别成 sql 的关键字。

        预编译 sql : 会把编译好的 sql 缓存起来,当要使用该 sql 时,不会再进行 词法分析,语法分析,语义分析。

        如此一来,不仅提高了 sql 的执行效率,#{} 传过来的参数不会参与 sql 的语法构建。

        #{} 占位符会会根据类型,自动拼接 ' ' ,${} 会对参数直接进行替换,如果参数为字符串,需要加   ' ' 号。如下代码

@Select("select * from user_info whereusername= '${name}' ")
UserInfo queryByName(String name);

        因为 #{} 占位符会拼接 '' 号,在一些 sql 中,并不需要加单引号,就必须使用 ${} 占位符。如下示例

@Select("select * from user_info order by id ${sort}")
public List<UserInfo> selectUserSortById(String sort);
http://www.dtcms.com/a/325781.html

相关文章:

  • C/C++练习面试题
  • PyTorch基础(使用Numpy实现机器学习)
  • PyTorch基础(使用Tensor及Antograd实现机器学习)
  • OCSSA-VMD-Transformer轴承故障诊断,特征提取+编码器!
  • cs的搭建和使用
  • 力扣-153.寻找旋转排序数组中的最小值
  • Kubernetes-核心概念
  • 2438. 二的幂数组中查询范围内的乘积
  • flutter入门
  • 从 Kotlin ViewModel 到 Flutter:完整迁移指南与状态管理实践
  • Flutter Dialog、BottomSheet
  • Python调用C/C++函数库的多种方法与实践指南
  • LCR 120. 寻找文件副本
  • LLM 残差链接是什么
  • TRL - Transformer Reinforcement Learning SFTTrainer 和 SFTConfig
  • docker是什么以及镜像命令详解
  • ROS2学习(1)—基础概念及环境搭建
  • B 树与 B + 树解析与实现
  • 北斗水文环境监测站在水库的应用
  • Linux操作系统从入门到实战(二十)进程优先级
  • 【从零开始java学习|第一篇】java中的名词概念(JDK、JVM、JRE等等)
  • 15. xhr 对象如何发起一个请求
  • VSCode右键菜单消失,修复VSCode右键菜单
  • raid10 允许最多坏几块磁盘,如何修复阵列?
  • lesson35:数据库深度解析:从概念到MySQL实战学习指南
  • 如何使用 Watchtower 实现定时更新 docker 中的镜像并自动更新容器(附 schedule 的参数详细解释)
  • 升级 ChatGPT 提示“您的银行卡被拒绝了”或者“您的信用卡被拒绝了。请尝试用借记卡支付。“如何解决?
  • FPGA+护理:跨学科发展的探索(二)
  • CVPR 2025 | 即插即用,极简数据蒸馏,速度up20倍,GPU占用仅2G
  • 【数字图像处理系列笔记】Ch09:特征提取与表示