当前位置: 首页 > 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.lryc.cn/news/617708.html

相关文章:

  • 一周学会Matplotlib3 Python 数据可视化-绘制直方图(Histogram)
  • 银河麒麟V10配置KVM的Ubuntu虚机GPU直通实战
  • 梯度裁剪总结
  • 做调度作业提交过程简单介绍一下
  • Spring Cloud Gateway 路由与过滤器实战:转发请求并添加自定义请求头(最新版本)
  • 如何安装 Git (windows/mac/linux)
  • 【数据可视化-85】海底捞门店数据分析与可视化:Python + pyecharts打造炫酷暗黑主题大屏
  • Java数据库编程之【JDBC数据库例程】【ResultSet作为表格的数据源】【七】
  • NY185NY190美光固态闪存NY193NY195
  • cf--思维训练
  • 【C++语法】输出的设置 iomanip 与 std::ios 中的流操纵符
  • Dashboard.vue 组件分析
  • 基于 Axios 的 HTTP 请求封装文件解析
  • 【Redis的安装与配置】
  • ESP32将DHT11温湿度传感器采集的数据上传到XAMPP的MySQL数据库
  • loading效果实现原理
  • 【JAVA】使用系统音频设置播放音频
  • 在线代码比对工具
  • Selenium元素定位不到原因以及怎么办?
  • 机器学习 TF-IDF提取关键词,从原理到实践的文本特征提取利器​
  • Effective C++ 条款36: 绝不重新定义继承而来的非虚函数
  • Excel 连接阿里云 RDS MySQL
  • 开闭原则代码示例
  • Pytest项目_day11(fixture、conftest)
  • js数组reduce高阶应用
  • B 树与 B + 树解析与实现
  • 可商用的 AI 图片生成工具推荐(2025 最新整理)
  • Kubernetes部署apisix的理论与最佳实践(一)
  • 专题:2025人形机器人与服务机器人技术及市场报告|附130+份报告PDF汇总下载
  • docker安装Engine stopped