如何安全加载包含多个文档的YAML文件?
YAML多文档安全加载的那些事儿
处理YAML文件时,安全加载是不可忽视的要点。首先,单个YAML文档的标准安全加载方式是:
YAML.safe_load(content)
YAML本身支持在单个文件里包含多个文档,用---作为分隔符,比如这样的内容:
--- key: value --- key: !ruby/struct foo: bar
用safe_load加载多文档的局限
当你用YAML.safe_load(content)加载上面的多文档YAML时,只会返回第一个文档的内容:
{ 'key' => 'value' }
如果单独拆分出第二个文档再用safe_load加载,就会触发预期的安全异常——因为Struct不在默认的安全类白名单里:
Psych::DisallowedClass (Tried to load unspecified class: Struct)
加载多文档的常规方式
要一次性加载所有文档,你可以使用YAML.load_stream(content),它会返回一个包含所有文档内容的数组:
[ { 'key' => 'value' }, { 'key' => #<struct foo="bar"> } ]
现存的问题
可惜的是,目前Ruby的YAML库并没有提供YAML.safe_load_stream这样的方法,没办法在加载多文档时自动对非白名单的数据类型抛出安全异常,这在需要严格安全校验的场景下是个不小的缺憾。
内容的提问来源于stack exchange,提问作者Kimmo Lehto
相关产品推荐
相关产品推荐

