如何防御基于JSON扩展字段的SQL注入_解析字段后进行参数绑定

千磊酱_4139

千磊酱_4139

2026-05-03

253人浏览

原创

json解析结果必须视为不可信输入,所有值须经白名单校验并严格参数化处理,禁止字符串拼接sql;动态字段名、json路径等均需双重校验,否则将导致sql注入。

如何防御基于json扩展字段的sql注入_解析字段后进行参数绑定

JSON字段解析后直接拼进SQL字符串,等于开门揖盗

只要把解析出来的JSON值(比如 user.get("name"))用 + 或 String.format() 塞进 SQL 字符串里,就立刻回到高危状态。哪怕你前面用了 ObjectMapper.readValue()、做了非空校验、甚至 trim 了空格,都拦不住 ' OR '1'='1 这类输入。数据库只认语法,不认“你本意是不是想查数据”。

常见错误现象:MySQLSyntaxErrorException 频发但 SQL 日志里看不出明显语法错;某次传 {"status":"active' -- "} 后查询返回全部记录;后台日志出现 UNION SELECT 或 EXTRACTVALUE 等报错注入特征。

  • 所有 JSON 解析结果(JsonNode.asText()、Map.get()、object.field)都必须视为不可信输入
  • 禁止对 JSON 字段做任何“看起来安全”的假设——比如认为 status 只能是 active/inactive,就跳过参数化
  • 如果 JSON 结构固定,优先用 Jackson 的 @JsonProperty + POJO 绑定,而非泛型 Map<string object></string>

MyBatis 中 JSON 字段必须用 #{},禁用 ${}

${} 是字符串替换,JSON 字段值进去就是裸奔;#{} 才走 PreparedStatement 预编译。哪怕字段名来自 JSON,只要它是值(不是表名、排序字段),就必须走 #{}。

使用场景:用户提交 {"filter":{"name":"admin","age":25}},后端解析后用于 WHERE 条件。

  • 正确写法:WHERE name = #{filter.name} AND age = #{filter.age}
  • 错误写法:WHERE name = '${filter.name}'(单引号包着也无效)
  • 模糊查询要加 concat('%', #{keyword}, '%'),不能写成 "%${keyword}%"
  • 如果 JSON 里嵌套了数组(如 {"ids":[1,2,3]}),需转成 IN (?, ?, ?) 形式,用 MyBatis 的 <foreach></foreach> 动态生成占位符

动态字段名(如 JSON 中的 sortField)必须白名单硬校验

JSON 里如果带 {"sort":"email DESC"} 这种字段,ORDER BY ? 会直接报错——预编译不支持结构参数。这时候不能妥协用 String.format("ORDER BY %s", sort),得靠白名单+正则双保险。

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载

性能影响几乎为零,但漏掉一个字符就可能被绕过。

  • 定义明确白名单:Set.of("id", "name", "email", "created_at")
  • 方向单独校验:if (!"ASC".equals(dir) && !"DESC".equals(dir)) throw new IllegalArgumentException();
  • 完整匹配组合:"email DESC" 必须整体在白名单中,不能只校验 email 部分
  • 拒绝任何空白符、Unicode 分隔符、不可见字符——用 sort.trim().replaceAll("\s+", " ") 规范化后再比对

JSON 路径表达式(如 JSON_EXTRACT(user_meta, '$.phone'))也要参数化

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 里掏出来的值,都要重新经历“是否可信→是否白名单→是否参数化”的三重判断。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json sql注入

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4403

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

911

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1149

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6341

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3143

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6300

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8581

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1170

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1012

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习