【问题标题】:Is it possible to use references in JSON?是否可以在 JSON 中使用引用?
【发布时间】:2016-09-15 17:38:46
【问题描述】:

我有这个 JSON:

{
    "app_name": "my_app",
    "version": {
        "1.0": {
            "path": "/my_app/1.0"
        },
        "2.0": {
            "path": "/my_app/2.0"   
        }
    }
}

是否可以以某种方式引用关键字app_nameversion 的键,这样我就不必重复“my_app”和版本编号?

我在想一些类似...(代码完全编造):

{
    "@app_name": "my_app",
    "version": {
        "1.0": {
            "path": "/{{$app_name}}/{{key[-1]]}}"
        },
        "2.0": {
            "path": "/{{$app_name}}/{{key[-1]}}"    
        }
    }
}

或者这是否可以使用 YAML 更好地处理?

最后,我打算将这些数据读入 Python 字典。

【问题讨论】:

  • 我认为{{$key}} 指的是"path" 而不是"1.0"
  • 我找到了jsonref,它可以在 JSON 中引用。我只是不认为我可以使用它来获取对键的相对引用(意思是在我上面的伪代码中获取 1.02.0)。
  • @Anthon 是的,你是对的。我把它编辑成说别的……

标签: python json yaml


【解决方案1】:

不,JSON 没有引用。 (您在此处请求的功能,带有子字符串扩展,会向解析器的内存攻击开放;通过不支持此功能,JSON 避免了此类攻击的脆弱性)。

如果你想要这样的功能,你需要自己实现它。

【讨论】:

  • 您能否提供有关基于引用功能的 YAML 攻击的来源?由于标记,我只能找到基于对象实例化的漏洞。
  • @Anthon,在这种情况下,我指的是内存放大攻击——这些攻击也针对提供相同功能的 XML 扩展进行,利用嵌套包含来生成占用少量带宽的文档传输但要解析的内存量很大。因此是 DOS 攻击,而不是代码执行攻击(如您上面提到的那些)。
  • 有趣的概念。我将运行一些测试,看看你可以在 Python 中获得什么级别的放大。在使用引用来合并字典时,我发现了一个更大的问题,因为大多数解析器在阅读时都会扩展这些(我知道的一个例外是我的 ruamel.yaml 解析器在往返模式下用于 Python)。
  • 您说的是 XML 中的包含,它与 YAML 中的引用无关。由于 YAML 中的引用是严格排序的(您不能引用低于当前位置的对象),因此始终可以进行单遍解释,因此与引用相关的内存消耗在 O(n) 中。我对 YAML 易受此类攻击的说法提出质疑,并恳请您提供证据。
  • “O(n)”不遵循“单通解释总是可能的”。 如果 OP 在此处请求的子字符串扩展功能可用(我不知道是否可用),那么内存使用量大于 O(n) 的示例通过"s1": "string here""s2": "{{$s1}}{{$s1}}{{$s1}}...", "s3": "{{$s2}}{{$s2}}{{$s2}}...", "s4": {{$s3}}{{$s3}}{{$s3}}..." 等系列。如果 OP 在关于该功能可用性的问题中的断言是错误的,那么我的结论当然也是如此。
【解决方案2】:

不是纯 JSON,但您可以在解析 JSON 后执行字符串替换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2021-12-22
    • 2014-02-20
    • 2014-02-15
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多