【问题标题】:Is it safe to parse json with YAML.load?使用 YAML.load 解析 json 是否安全?
【发布时间】:2014-08-27 19:37:48
【问题描述】:

我正在使用 ruby​​ 2.1.0

我有一个 json 文件。 例如:test.json

    {
      "item":[
        {"apple": 1},
        {"banana": 2}
      ]
   }

使用 YAML.load 加载此文件是否安全?

    YAML.load(File.read('test.json'))

我正在尝试加载 json 或 yaml 格式的文件。

【问题讨论】:

  • 以什么方式安全?会导致任意代码运行吗?
  • YAML 和 JSON 根本不是一回事。您是否尝试加载 JSON?还是 YAML?您的示例看起来像 JSON,那么为什么不直接使用 JSON.load
  • @Pete 我正在尝试加载 JSON 或 YAML 文件。这似乎是我的一种组合方式。以后如果 yaml 来了,这段代码不会中断。
  • 我希望 YAML 解析器在遇到无效的 YAML(JSON 不是有效的 YAML)时抛出异常,因此您可以捕获任何解析异常,并回退到使用 JSON.load
  • @Pete 你确定 JSON 不是有效的 YAML 吗?看到这个。 stackoverflow.com/questions/1726802/…

标签: ruby json yaml


【解决方案1】:

YAML 可以加载 JSON

YAML.load('{"something": "test", "other": 4 }')
=> {"something"=>"test", "other"=>4}

JSON 将无法加载 YAML。

JSON.load("- something\n")
JSON::ParserError: 795: unexpected token at '- something'

会有一些不起眼的案例起作用并产生不同的输出。

YAML.load("")
=> false
JSON.load("")
=> nil

但通常 YAML 构造不兼容 JSON。

所以,首先尝试 JSON.load,因为它可能更擅长隐藏 JSON 内容。
捕获 JSON::ParserError 错误并退回到 YAML.load

【讨论】:

  • 不,不是,你应该使用 safe_load:arp242.net/yaml-config.html
  • @StefanSteiger “不,它不是”指的是什么?
  • 嗯,问题是“使用 yaml.load 加载 json 是否安全”。答案是否定的,不是 YAML.load,只有 YAML.safe_load。 - 否则,代码注入是可能的。
  • @StefanSteiger OP 在他的 cmets 中澄清说,他正在尝试加载 json 或 yaml 而不是安全“安全”。
  • 是的,没错,但它仍然是错误的。您也可以只使用 YAML.safe_load,然后它将适用于 JSON 和 YAML(因为根据定义,YAML 是 JSON 的超集 - 至少在理论上),并且是安全的。如果 YAML 解析器在任何 json 上都失败,那将是 yaml 解析器中的错误。
【解决方案2】:

recent work I did 中,我发现了马特提到的那种极端情况。例如

puts JSON.load('{"x": "foo\/bar"}')['x']

打印成功

foo/bar

尽管无故逃避¹而

puts YAML.load('{"x": "foo\/bar"}')['x']

失败:

Psych::SyntaxError ((<unknown>): found unknown escape character while parsing a quoted scalar at line 1 column 7)

¹在这种情况下,Java 根据net.sf.json.util.JSONUtils.quote。请注意,他们忘记在自己的 Javadoc 中引用相同的内容,这很讽刺,所以您必须浏览源代码才能理解!

【讨论】:

  • 很好的bug 在 psychs libyaml 中
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
相关资源
最近更新 更多