子模式中使用$id的安全风险及相关JSON Schema规范咨询
问题解答
1. JSON Schema规范中关于$id映射持久化的相关章节
在JSON Schema Draft 2020-12核心规范的8.2.2 注册标识符章节中明确规定:
当在评估过程中遇到包含
$id关键字的模式对象时,实现必须将其解析后的标识符(基于当前基础URI)注册到当前评估上下文的模式注册表中,映射到该模式对象本身。此注册在评估上下文的生命周期内是永久的;后续对模式对象的修改(包括移除或修改$id关键字)不会影响已有的注册条目。
这正是Jason Desrosiers所说“移除$id后映射仍不会消失”的规范依据。
2. 子模式使用$id的安全风险与恶意利用可能性
子模式中使用$id本身是JSON Schema的合法用法,用于定义可被引用的模块化子模式,但在特定场景下存在安全风险,其持久化映射的行为也可能被恶意利用:
- 抢占式注册攻击:如果验证环境的模式注册表是共享的(比如多用户的验证服务、复用评估上下文的系统),攻击者可以构造包含
$id的恶意子模式,抢先注册一个被广泛使用的URI(例如某个公开标准模式的地址)。后续合法模式引用该URI时,会被解析到恶意注册的模式,而非预期的标准模式,导致验证逻辑被篡改。 - 上下文复用漏洞:若服务端未在每次请求后正确清理评估上下文的注册表,之前请求中注册的恶意
$id映射会被保留。后续请求的验证会误用这些残留的映射,导致正常的验证逻辑失效或被劫持。 - 意外的模式污染:在本地或客户端环境中,如果多次加载不同模式但复用同一个注册表,旧模式中
$id的持久化映射可能会干扰新模式的引用解析,导致验证结果不符合预期——这种情况虽不算“恶意利用”,但属于设计不当带来的安全隐患。
规范要求同一个标识符只能被注册一次,后续注册不会覆盖已有条目,因此主要风险集中在抢先注册和上下文未清理的场景中。
内容的提问来源于stack exchange,提问作者Roger Costello
相关产品推荐
相关产品推荐

