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

Mybatis中 ${} 和 #{} 的区别

文章目录

  • 引言
  • 一、${} 占位符
  • 二、#{} 占位符
  • 三、SQL 注入
    • 错误做法
    • 正确做法
  • 占位符总结


引言

MyBatis 作为一款流行的 ORM 框架,其主要用于映射数据库操作和 Java 对象。在 MyBatis 中,${} 和 #{} 都是用于处理 SQL 动态内容的占位符,但它们的功能和用途有所不同。


一、${} 占位符

${} 占位符是 Mybatis 中的字符串替换占位符,实际上就是拼接字符串,但是如果参数值来自用户输入,容易受到 SQL 注入攻击,使用时要小心。


二、#{} 占位符

#{} 占位符是Mybatis中的参数占位符,MyBatis 会将 sql 中的 #{} 替换为 ? 号,用于防止 SQL 注入,执行时会被替换为参数值并通过 PreparedStatement (预编译语句)传递给数据库。


三、SQL 注入

错误做法

在 MyBatis 中,${} 会直接将参数的值拼接到 SQL 语句中,比如此时用户正在登录,SQL 语句如下:

SELECT * FROM user WHERE username = '${username}'

但由于用的是 ${},此时可以进行字符串拼接,最终 SQL 语句会变成:

SELECT * FROM user WHERE username = 'admin' OR '1'='1'

OR ‘1’=‘1’ 始终为真,这意味着查询会返回 user 表中的所有数据,而不仅仅是 admin 用户。

正确做法

使用 #{},因为它会使用 PreparedStatement 进行参数绑定,避免 SQL 注入:

SELECT * FROM user WHERE username = #{username}

在这种情况下,即使用户输入 admin’ OR ‘1’='1,SQL 语句仍然是:

SELECT * FROM user WHERE username = ?

然后 MyBatis 会将 username 的值作为参数传递给数据库,而不是直接拼接到 SQL 语句中。这样即使用户输入 OR ‘1’='1,恒为真不会影响到原 SQL 语句,从而有效防止 SQL 注入攻击。


占位符总结

方式安全性说明
${}不安全直接拼接 SQL,容易被 SQL 注入攻击利用
#{}安全通过预编译的方式传递参数,防止 SQL 注入
http://www.dtcms.com/a/92802.html

相关文章:

  • C++项目:高并发内存池_下
  • dell 台式机 电脑 纽扣电池 如何取下?
  • 【NLP 44、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
  • c#个人向总结
  • 【Linux网络】——Socket网络编程
  • optimization和compression理解
  • conda install 慢
  • Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法
  • 飞速(FS)企业网布线解决方案:赋能能源行业客户高效网络部署与智能化管理
  • 再探带权并查集
  • 麒麟信安全国产化智算一体机与海光C86芯片+ 海光DCU卡完成兼容性适配!
  • Softmax 回归 + 损失函数 + 图片分类数据集
  • LangChain开发(七)自定义输出格式(JSON/XML/YAML)
  • VMware面向公众的存储库 URL 和身份验证机制正在发生变化
  • 帕金森患者的生活重塑:从 “嘴” 开启康复之旅
  • AutoCAD C#二次开发中WinForm与WPF的对比
  • 告别分库分表,时序数据库 TDengine 解锁燃气监控新可能
  • docker拉取镜像报错
  • 算法分析与设计课堂实验(5 分支策略3
  • STM32 MODBUS-RTU主从站库移植
  • 【Linux】——进程(下)
  • 【商城实战(65)】退换货流程全解析:从前端到后端的技术实现
  • HTML5 SVG:图形绘制的现代标准
  • STL之string
  • Qt的文件操作
  • Linux <(...) 进程替换
  • 【STM32】编写程序控制开发板的RGB LED灯
  • STM32单片机uCOS-Ⅲ系统12 CPU利用率与堆栈检测
  • [plugin:vite:import-analysis] Cannot find module ‘vuex\dist\vuex.esm-bundler
  • 风光互补智慧路灯的灯杆设计有哪些要求?