尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

MyBatis 如何预防SQL注入------使用#{}与${}的区别

MyBatis 如何预防SQL注入------使用#{}与${}的区别
📅 发布时间:2026/7/28 18:05:08

什么是SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。(百度百科)

例如攻击者在密码栏上输入' or 1 = 1 #,如果后台是通过SQL直接拼接用户输入来做查询的话,攻击者就可以成功侵入了。如:

SELECT * FROM user WHERE uername=' ' or 1 = 1 # ' AND password = ''

由于 1 = 1 是恒等式,所以该 SQL 就相当于:

SELECT * FROM user

所以后端需要对类似的攻击做好防备,不能简单的使用字符串拼接来做SQL查询。

#{}与${}的区别

对于#{}:

<select id="getUserById" resultType="User" parameterType="java.lang.Integer"> SELECT uid, username FROM user WHERE uid = #{uid} </select>

MyBatis 的 #{} 底层其实是靠 JDBC 的 PreparedStatement 类实现 SQL 的预编译:

SELECT uid, username FROM user WHERE uid = ?

然后通过parameterType确定传入的参数类型,将预编译好的 SQL中的占位符 "?"替换成传入的参数。

因为 SQL 注入只对编译过程起作用,所以这样就可以很好地避免 SQL注入的问题了。而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。

对于${}:

<select id="getUserById" resultType="User" parameterType="java.lang.Integer"> SELECT uid, username FROM user WHERE uid = ${uid} </select>

在MyBatis中,${} 这样格式的参数会直接参与SQL编译,从而不能避免注入攻击,就好像前面 SQL 注入所提到的例子一样。

但涉及到动态表名和列名时,只能使用 ${} 这样的参数格式。

因为使用 #{} 的话就好比使用 parameterType 的 setString() 方法插入字符串,但这样做是会让参数带上单引号的。如

总结

在编写MyBatis的SQL时,尽量采用#{}。除非有需要才使用${},但要注意做好过滤工作,防止SQL注入攻击。

#{}:相当于JDBC中的PreparedStatement,会帮我们预编译再替换其中的 ?

${}:是直接输出变量的值,然后拼接成 SQL 执行

相关新闻

  • 【单片机毕业设计推荐】基于 STM32 的环境温湿度与水位智能监控系统设计,基于 STM32 的加湿补水智能控制与语音报警系统设计(011604)
  • Nintendo Switch大气层系统:开启游戏主机无限潜能的终极解决方案
  • 餐饮CPS平台开发公司排名,多级佣金自动结算源码讲解

最新新闻

  • bq2026评估套件实战指南:从硬件连接到EPROM编程
  • AI Agent驱动空间研究成果智能生产——以空间数据为载体、以论文写作为目标的空间选题论证·Codex分析工程·五维质量审查·GIS专业制图与论文图组全链路技术实践
  • CSS-笔记1-选择器与文本元素
  • 如何创建.babelrc文件?
  • Spring 事务
  • 星巴克双赛事体育营销策略与执行全解析

日新闻

  • 力旷智能:伺服驱动系统在制药收瓶设备中的应用解析
  • 2026 网安入门避坑指南,零基础如何避开无效学习直接上手实战
  • 揭秘CFC项目:如何通过手机摄像头实现850kbps无网络文件传输

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号