当前位置: 首页 > 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 注入

相关文章:

  • 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主从站库移植
  • 女租客欠租后失联,房东开门后无处下脚:40平公寓变垃圾场
  • 新闻1+1丨多地政府食堂开放 “舌尖上的服务”,反映出怎样的理念转变?
  • 想要“逆转”糖尿病,减少这两处脂肪是关键
  • 工程机械行业景气度持续回升,三大龙头一季度营收、净利双增
  • 新华每日电讯“关爱青年成长”三连评:青春应有多样的精彩
  • 浙江“胖都来”开业多位明星祝贺,“胖东来”称已取证投诉,律师:碰瓷侵权