首页 游戏 软件 资讯 排行榜 专题
首页
数据库
JSON扩展字段SQL注入防御方法解析与参数绑定实践

JSON扩展字段SQL注入防御方法解析与参数绑定实践

热心网友
12
转载
2026-05-08
# JSON字段解析后直接拼进SQL字符串,等于开门揖盗 只要把解析出来的JSON值(比如 `user.get("name")`)用 `+` 或 `String.format()` 塞进SQL字符串里,就立刻回到高危状态。哪怕前面用了 `ObjectMapper.readValue()`、做了非空校验、甚至trim了空格,都拦不住 `' OR '1'='1` 这类输入。数据库只认语法,不认“你本意是不是想查数据”。 **常见错误现象**: - `MySQLSyntaxErrorException` 频发但SQL日志里看不出明显语法错 - 某次传 `{"status":"active' -- "}` 后查询返回全部记录 - 后台日志出现 `UNION SELECT` 或 `EXTRACTVALUE` 等报错注入特征 **必须遵守的铁律**: 1. 所有JSON解析结果(`JsonNode.asText()`、`Map.get()`、`object.field`)都必须视为不可信输入 2. 禁止对JSON字段做任何“看起来安全”的假设——比如认为status只能是active/inactive,就跳过参数化 3. 如果JSON结构固定,优先用Jackson的 `@JsonProperty` + POJO绑定,而非泛型 `Map` ## MyBatis中JSON字段必须用 `#{}`,禁用 `${}` `${}` 是字符串替换,JSON字段值进去就是裸奔;`#{}` 才走PreparedStatement预编译。哪怕字段名来自JSON,只要它是值(不是表名、排序字段),就必须走 `#{}`。 **使用场景**:用户提交 `{"filter":{"name":"admin","age":25}}`,后端解析后用于WHERE条件。 **正确写法**: ```sql WHERE name = #{filter.name} AND age = #{filter.age} ``` **错误写法**: ```sql WHERE name = '${filter.name}' # 单引号包着也无效 ``` **关键细节**: - 模糊查询要加 `concat('%', #{keyword}, '%')`,不能写成 `"%${keyword}%"` - 如果JSON里嵌套了数组(如 `{"ids":[1,2,3]}`),需转成 `IN (?, ?, ?)` 形式,用MyBatis的 `` 动态生成占位符 ## 动态字段名(如JSON中的 `sortField`)必须白名单硬校验 JSON里如果带 `{"sort":"email DESC"}` 这种字段,`ORDER BY ?` 会直接报错——预编译不支持结构参数。这时候不能妥协用 `String.format("ORDER BY %s", sort)`,得靠白名单+正则双保险。 性能影响几乎为零,但漏掉一个字符就可能被绕过。 **白名单校验四步法**: 1. **定义明确白名单**:`Set.of("id", "name", "email", "created_at")` 2. **方向单独校验**:`if (!"ASC".equals(dir) && !"DESC".equals(dir)) throw new IllegalArgumentException();` 3. **完整匹配组合**:`"email DESC"` 必须整体在白名单中,不能只校验 `email` 部分 4. **拒绝特殊字符**:用 `sort.trim().replaceAll("\s+", " ")` 规范化后再比对,拒绝任何空白符、Unicode分隔符、不可见字符 ## JSON路径表达式也要参数化 MySQL 8.0+ 和 PostgreSQL 的 JSON 函数虽支持路径字符串,但路径本身若来自用户输入(比如前端传 `path: "$.settings.theme"`),仍可能被构造为 `"$.settings.theme' OR '1'='1"` 导致注入。路径不是值,但它是执行上下文的一部分。 **容易踩的坑**:以为JSON函数自动免疫,结果在 `WHERE JSON_EXTRACT(data, ?) = ?` 里只对右边的值参数化,左边路径没处理。 **防护措施**: - 路径字段必须走白名单:`if (!allowedPaths.contains(path)) throw ...` - 禁止拼接路径字符串:`"$.user." + userInput` 是典型错误 - PostgreSQL 的 `->>` 操作符同理,`json_col ->> ?` 不合法,必须先校验再硬编码 - 如果业务真需要动态路径,改用存储过程封装校验逻辑,应用层只传索引或枚举key ## 总结 JSON字段解析和SQL绑定之间那层薄薄的“信任”,是最容易被忽略的攻击面。参数化不是写了 `#{}` 就万事大吉,而是每个从JSON里掏出来的值,都要重新经历“是否可信→是否白名单→是否参数化”的三重判断。
来源:https://www.php.cn/faq/2414983.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

ThinkPHP JSON解析错误排查与编码转换解决方案
编程语言
ThinkPHP JSON解析错误排查与编码转换解决方案

ThinkPHP处理JSON数据时,若报解析错误或返回空值,常因数据读取方式不当或编码问题。应使用`input( , ,false)`或`getInput()`直接获取原始数据,并检查UTF-8BOM、编码一致性及框架中间件干扰。混合提交场景需从`$_POST`手动解码。线上问题还需排查服务器配置对请求体的影响。

热心网友
05.07
SQL存储过程解析JSON参数使用JSON_VALUE函数详解
数据库
SQL存储过程解析JSON参数使用JSON_VALUE函数详解

在SQLServer存储过程中使用JSON_VALUE函数解析JSON参数时,需确保参数声明为NVARCHAR(MAX)以避免Unicode字符问题。提取标量值要求路径精确匹配,中文键名需转义。解析前必须用ISJSON()函数校验输入字符串的合法性,防止静默失败。当需要提取多个或嵌套字段时,建议使用OPENJSON函数以提高代码可维护性和解析性能。

热心网友
05.07
JSON序列化与反序列化常用方法及主流框架对比指南
编程语言
JSON序列化与反序列化常用方法及主流框架对比指南

一、Python标准库json模块 如果你需要一个零依赖、开箱即用的方案,Python内置的json模块无疑是首选。它轻量、直接,处理基础数据类型转换完全够用。 上手非常简单,第一步就是导入:import json。 想把一个Python字典变成JSON字符串?一行代码搞定:json_str = j

热心网友
05.06
FastAPI联表查询实现结构化JSON响应完整指南
编程语言
FastAPI联表查询实现结构化JSON响应完整指南

详解 FastAPI + SQLAlchemy 多表 JOIN 查询的 JSON 序列化难题与解决方案 在 FastAPI 项目中,当你试图通过 SQLAlchemy 执行一个多表 JOIN 查询——比如关联 `Post` 表和 `Vote` 表来统计每条帖子的点赞数——常常会遇到一个棘手的“拦路虎

热心网友
05.06
C# JSON序列化完整指南与常见问题解决方法
编程语言
C# JSON序列化完整指南与常见问题解决方法

C JSON序列化:那些看似“玄学”的问题,其实都有章可循 在C 里处理JSON,JsonSerializer Serialize 或 JsonConvert SerializeObject 这两行代码谁都会写。但真正让人头疼的,往往不是“怎么调”,而是那些藏在类型、配置、时区、命名规则里的细节。

热心网友
05.06

最新APP

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

热门推荐

OKX购买USDT新手教程:从注册到交易完整步骤详解
web3.0
OKX购买USDT新手教程:从注册到交易完整步骤详解

购买USDT是进入加密货币世界的重要一步。本文以OKX平台为例,详细介绍了从注册、身份认证到完成购买的完整流程,涵盖了快捷买币、C2C交易等不同方式的操作要点与注意事项,旨在帮助新手安全、顺利地迈出第一步。

热心网友
05.08
Windows 11 任务管理器新增AI硬件监控与NPU性能监测
电脑教程
Windows 11 任务管理器新增AI硬件监控与NPU性能监测

Windows任务管理器,终于跟上了AI时代 几十年来,Windows任务管理器堪称操作系统的“老伙计”,忠实记录着每一个进程的脉搏。但眼下,这位老将遇到了新挑战:它必须得追上一波十年前根本无法想象的技术浪潮。最典型的例子是什么?就是你新买的电脑里,很可能已经多了个叫“神经网络处理单元”(NPU)的

热心网友
05.08
Safari预览版十周年版本累计更新240次回顾苹果Web技术探索历程
电脑教程
Safari预览版十周年版本累计更新240次回顾苹果Web技术探索历程

苹果前沿 Web 技术试验田:Safari 预览版浏览器迎 10 周年,版本累计更迭 240 次 十年,对于一个快速迭代的科技产品来说,足以称得上一个里程碑。就在最近,苹果专门为开发者打造的浏览器测试工具——Safari 技术预览版,悄然迎来了它的十周岁生日。 故事要回溯到2016年3月30日。当时

热心网友
05.08
C4D教程TFD插件制作逼真烟雾效果详细步骤
电脑教程
C4D教程TFD插件制作逼真烟雾效果详细步骤

C4D怎么使用TFD插件制作烟雾效果呢? 说起在Cinema 4D里模拟烟雾效果,TFD(TurbulenceFD)插件绝对是很多高手的首选工具。不过,对于刚接触它的朋友来说,那一堆参数和设置可能有点让人无从下手。别担心,下面这份详细的流程图解式教程,将一步步带你从零开始,制作出细节丰富、动态真实的

热心网友
05.08
Cinema 4D制作线型三维立体圆环纹理详细步骤指南
电脑教程
Cinema 4D制作线型三维立体圆环纹理详细步骤指南

C4D必备技能:手把手教你打造三维线状圆环图纹 想要在Cinema 4D中创建出那种充满科技感和结构美的三维线状圆环图纹吗?这个效果在动态图形和视觉包装中应用广泛,制作过程其实并不复杂。掌握了核心的操作逻辑,几步就能实现,下面就为你拆解整个操作流程。 C4D怎么创建三维立体的线状圆环图纹效果 首先,

热心网友
05.08