首页 游戏 软件 资讯 排行榜 专题
首页
数据库
怎样解决MyBatis中$符号带来的SQL注入风险_替换为#预编译占位符

怎样解决MyBatis中$符号带来的SQL注入风险_替换为#预编译占位符

热心网友
94
转载
2026-04-23

怎样解决MyBatis中$符号带来的SQL注入风险?关键在于厘清场景

怎样解决MyBatis中$符号带来的SQL注入风险_替换为#预编译占位符

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

一提到MyBatis中的${}和SQL注入,很多人的第一反应是:“把它换成#{}不就行了?”

其实,这个想法恰恰是问题的开始。真相是:绝大多数情况下,${}不能直接“替换为”#{}——强行替换会导致SQL语法错误,程序根本跑不起来。真正的解决之道,在于搞清楚三个核心问题:哪些地方是误用了${}?哪些地方又不得不用${}?以及在那些必须用的场景下,如何守住安全底线。

哪些地方误用了${}?这是最常见的漏洞源头

生产环境里,绝大部分SQL注入漏洞都源于此。典型表现是:参数本应是纯粹的数据值(比如用户ID、搜索关键词、订单金额),却被错误地用${}拼接进了WHERE、INSERT或UPDATE子句中。

  • 错误写法示例:WHERE name = '${name}' 或者 AND status = ${status}
  • 后果有多严重?如果用户传入name="admin' OR '1'='1",SQL就会变成WHERE name = 'admin' OR '1'='1',直接导致全表数据泄露。
  • 正确做法:统一改为WHERE name = #{name}AND status = #{status}
  • 这里有个细节:#{}会自动处理类型,字符串会加引号,数字或布尔值会做对应转换,完全不需要手动拼接单引号。

哪些地方必须用${}?#{}真的无能为力

为什么不能全用#{}?因为它的底层是JDBC的PreparedStatement,所有参数都会被当作“值”来处理,并加上引号或进行类型绑定。而SQL语法中的某些部分,比如表名、字段名、ORDER BY后的排序方向、GROUP BY表达式,它们本身是“标识符”或“关键字”,绝对不能加引号,否则数据库会直接报语法错误。

  • 动态表名(如分库分表):FROM ${tableName}。如果写成FROM #{tableName},就会变成FROM 'user_202604',语法错误。
  • 动态排序:ORDER BY ${sortField} ${sortOrder}。如果字段名用了#{},会变成ORDER BY 'created_time',字段名被当成字符串,排序失效。
  • 动态分页的偏移量:LIMIT ${(page-1)*size}, #{size}。偏移量往往是个表达式,#{}不支持计算,而且偏移量作为数字也不能加引号。

必须用${}时,如何防御注入?白名单校验是唯一靠谱的方案

到了这一步,没有“银弹”。别指望靠过滤几个关键词或者转义单引号就能万事大吉,攻击面太广了(比如UNION SELECT、注释符--、内联注释/* */)。唯一能落地、真正有效的防御策略就是:只允许已知安全的输入。

  • 对动态表名:在Ja va层定义合法的表名数组,比如String[] validTables = {"user", "order_202601", "order_202602"},然后严格校验传入值是否在名单内:Arrays.asList(validTables).contains(tableName)
  • 对排序字段:使用枚举或Map进行映射。例如,建立一个映射关系:Map.of("ctime", "created_time", "utime", "updated_time")。前端只传递“ctime”这样的key,后端根据映射表转换为真实的数据库字段名。
  • 对排序方向:强制限定只能为"asc""desc",其他任何输入一律拒绝,或者提供一个安全的默认值(如"asc")。
  • 核心原则:绝对不要将用户原始的、未经检查的输入(无论是HTTP参数还是JSON字段)直接塞进${}里。这无异于给攻击者递上了一把打开数据库大门的钥匙。

模糊查询(LIKE)场景的典型陷阱与正确解法

这个场景非常典型。很多人为了图省事,会写成LIKE '%${keyword}%',但这正是高危写法。正确的姿势是,让#{}承担传递值的责任,而通配符的逻辑交给数据库函数去处理。

  • 错误的高危写法:WHERE title LIKE '%${keyword}%'。如果keyword="a%b' OR '1'='1",注入将直接穿透。
  • 推荐写法(MySQL):WHERE title LIKE CONCAT('%', #{keyword}, '%')
  • 或Oracle写法:WHERE title LIKE '%' || #{keyword} || '%'
  • 关键点:通配符%由数据库的字符串连接函数(如CONCAT)包裹,用户输入的值始终通过#{}走预编译,完全不参与SQL字符串的拼接。

最后,还有一个极易被忽略的“坑”:MyBatis Generator等工具自动生成的XML代码中,片段和ORDER BY子句默认可能使用${}。很多人直接复制使用,却忘了补充白名单校验。记住,只要代码中间出现了${},就必须问自己一句:这个值是完全由我控制的吗?如果答案是否定的,那么就必须在Ja va层加上一层严格的校验或映射转换。这才是守住安全防线的关键所在。

来源:https://www.php.cn/faq/2324230.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

怎样解决MyBatis中$符号带来的SQL注入风险_替换为#预编译占位符
数据库
怎样解决MyBatis中$符号带来的SQL注入风险_替换为#预编译占位符

怎样解决MyBatis中$符号带来的SQL注入风险?关键在于厘清场景 一提到MyBatis中的${}和SQL注入,很多人的第一反应是:“把它换成 {}不就行了?” 其实,这个想法恰恰是问题的开始。真相是:绝大多数情况下,${}不能直接“替换为” {}——强行替换会导致SQL语法错误,程序根本跑不起来

热心网友
04.23
怎样检测.NET程序中的LINQ to SQL注入_避免使用动态字符串构造Query
数据库
怎样检测.NET程序中的LINQ to SQL注入_避免使用动态字符串构造Query

如何有效检测 NET应用中的LINQ to SQL注入风险?杜绝动态SQL拼接的安全隐患 为何 DataContext GetCommand() 无法作为SQL注入检测的有效方法 许多开发者存在一个普遍的误解:认为通过调用 DataContext GetCommand(query) 获取生成的SQL

热心网友
04.22

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

TripMate
AI
TripMate

TripMate是什么 规划一次完美的旅行,最磨人的往往是前期的信息海选和行程拼图。现在,一款名为TripMate的AI旅行助手,正试图把我们从这种繁琐中解放出来。简单来说,它是一个由人工智能驱动的个人旅行规划工具,核心目标就一个:让个性化的行程规划变得又快又省心。用户不必再在各种攻略网站间反复横跳

热心网友
04.23
Artwo
AI
Artwo

Artwo是什么 浏览器标签页多到能开火车,收藏夹杂乱得像毛线球——这大概是每个深度上网冲浪者的日常痛点。Artwo的出现,正是为了终结这种混乱。这款工具的核心,是将AI的智能与网页资源管理深度结合,帮你把散落各处的网页信息,整理成井井有条的知识库。它不仅仅是个高级书签管理器,更像是一个能理解你需求

热心网友
04.23
Best AI Jobs
AI
Best AI Jobs

Best AI Jobs是什么 当你琢磨着在人工智能领域找份新工作时,面对海量却不精准的招聘信息,是不是常常感到头疼?这时候,一个专业的垂直平台就显得尤为重要了。Best AI Jobs,正是为此而生。它是一个专注于人工智能领域的职业搜索引擎,核心使命就是帮用户在全球范围内精准定位AI相关的职位。无

热心网友
04.23
FreeAiKit
AI
FreeAiKit

FreeAIKit是什么 当你听到“AI工具套件”时,脑子里会浮现什么?复杂的代码、难懂的术语,还是昂贵的订阅费?FreeAIKit的出现,可以说彻底打破了这些刻板印象。这个由Easy With AI打造的综合平台,目标非常明确:让AI变得触手可及。它集成了图像生成、市场营销、生产力提升等一系列工具

热心网友
04.23
WPS Office
AI
WPS Office

WPS Office是什么 提到办公软件,很多人的第一反应可能是微软的Office套件。但今天,我们得好好聊聊另一个重量级选手——WPS Office。它出自中国的金山软件,是一款功能完整的免费办公解决方案。简单来说,它集成了文档编辑、表格处理、幻灯片制作以及PDF工具于一体,旨在为用户提供一个流畅

热心网友
04.23