使用Psych 4中的YAML/Store加载不安全的YAML

3
最近Ruby的YAML库(Psych 4)有了变化,如果包含别名或尝试实例化未指定的类,则会导致“不安全”的YAML失败。这在多个地方都有讨论,比如像这个StackOverflow问题
我正在尝试弄清楚如何告诉派生的yaml/store库允许加载不安全的YAML,或提供我的允许类列表。
据我所知,文档很少,阅读后,这是我能想到的唯一合理的尝试:
require 'date'
require 'yaml/store'

# 1. These options work perfectly with YAML.load_file, but not with YAML::Store
# 2. These options are not needed in Psych < 4.0
yaml_opts = { aliases: true, permitted_classes: [Time, Date, Symbol] }

store = YAML::Store.new 'log.yml', yaml_opts
data = store.transaction { store[:entries] }
p data

使用这个YAML文件:

# log.yml
:entries:
- :timestamp: 2018-07-09 00:00:00.000000000 +03:00
  :action: Comment
  :comment: Started logging

在Psych 4中会失败,在Psych 3中成功。

# Gemfile
source "https://rubygems.org"
gem 'psych', '>= 4.0'    # fail
# gem 'psych', '< 4.0'   # pass

作为一个相关的轶事,文档中演示的例子,在尝试使用 store.transaction { store["people"] } 加载时也会失败。

1个回答

9

虽然这不是正确的做法,但在找到更好的解决方案之前,我发现添加以下代码可以解决问题。

module YAML
  class << self
    alias_method :load, :unsafe_load
  end
end

这只是将底层的YAML::load方法恢复到其3.x版本中的unsafe_load行为,而不是safe_load

在我的YAML来自可信源的情况下(100%的用例),我没有看到新的Psych 4行为带来的任何好处,并认为将其还原是可以的(尽管很尴尬)。

相关的源代码参考是3.3.2→4.0.0差异


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接