Ruby的YAML库(精神病学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这在“精神病学4”中失败,而对“精神病学3”则成功。
# Gemfile
source "https://rubygems.org"
gem 'psych', '>= 4.0' # fail
# gem 'psych', '< 4.0' # pass作为一个相关的轶事,在文档中演示的示例在试图用store.transaction { store["people"] }加载它时也失败了。
发布于 2022-03-02 18:57:42
虽然这不是正确的做事方式,但在找到更好的答案之前,我发现添加下面的代码可以解决问题。
module YAML
class << self
alias_method :load, :unsafe_load
end
end这只是将底层的YAML::load方法还原为其3.x行为的unsafe_load,而不是safe_load。
如果我的YAML来自受信任的源(我的用例的100%),我看不到新的精神病学4行为的任何好处,我觉得恢复它是可以的(虽然很尴尬)。
相关的源代码引用是3.3.2→4.0.0差异
https://stackoverflow.com/questions/71322870
复制相似问题