使用YAML.load解析json是否安全?

时间:2014-07-07 10:36:08

标签: ruby json yaml

我正在使用ruby 2.1.0

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

recent work I did中,我发现了Matt所指的那种极端情况。例如

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中进行相同的引用,具有讽刺意味的是,因此您必须浏览源代码才能理解!