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

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

什么是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 执行

http://www.jsqmd.com/news/1282089/

相关文章:

  • centos7安装fastdfs单机版
  • The server encountered an unexpected condition that prevented it from fulfilling the request.
  • 【JAVA课程设计/毕业设计】基于 SpringBoot 的数字化校园社区交流与信息传播系统 高校综合型校园论坛互动服务管理平台【附源码、数据库、万字文档】
  • HarmonyOS 启动任务编排实战:依赖、并发、超时与失败兜底
  • 21.1%高增速!工业5G/TSN网关开启2026-2032年发展黄金赛道
  • 【单片机毕业设计推荐】基于 STM32 的环境温湿度与水位智能监控系统设计,基于 STM32 的加湿补水智能控制与语音报警系统设计(011604)
  • 3分钟掌握网盘直链下载助手:一键获取9大网盘真实下载地址的完整指南
  • PHP:数组的排序函数:
  • 如何在5分钟内构建完全私有的搜索引擎:SearXNG Docker终极指南
  • Nintendo Switch大气层系统:开启游戏主机无限潜能的终极解决方案
  • 2026贵阳旧银回收门店行业全景盘点:正规合规实体门店优势详解、选型避坑FAQ及靠谱服务商推荐 - U渠道
  • data_structure_1
  • pacemaker控制haproxy容器
  • Human Resource Machine 全成就通关 第38关
  • 终极指南:如何快速解决Navicat试用到期问题,实现无限免费使用
  • 餐饮CPS平台开发公司排名,多级佣金自动结算源码讲解
  • Hibernate之关联关系(一对多)
  • Web逆向实战:阿里资产法拍sign参数生成算法分析与复现
  • 2019银川网络赛 Rolling The Polygon 简单的计算几何
  • 【JAVA课程设计/毕业设计】基于SpringBoot+Vue的校园流浪动物收容救助与科普宣传系统 数字化高校流浪动物管护与帮扶服务平台【附源码、数据库、万字文档】
  • 5分钟解决ComfyUI视频合成节点缺失的终极指南
  • League Akari:英雄联盟玩家的终极效率革命与智能决策系统
  • combinations(组合数)
  • keepalived主备VIP配置
  • 关于Spring3.2.0中@Autowire默认配置的测试
  • 全国武校训练设施排名,圣龙武术学校场馆设备 - 圣龙武术朱老师
  • 校验和算法分析【转】
  • 本地外卖分销系统哪家靠谱,卡券核销防作弊底层设计
  • 服务计算:搭建私有云
  • LeetCode-Python-273. 整数转换英文表示