首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在精神病学4中用YAML/Store加载不安全的YAML

在精神病学4中用YAML/Store加载不安全的YAML
EN

Stack Overflow用户
提问于 2022-03-02 12:40:46
回答 1查看 1.1K关注 0票数 1

Ruby的YAML库(精神病学4)中最近的一项更改会导致“不安全”的YAML在包含别名时失败,或者试图实例化未指定的类。这在多个地方都有讨论,比如这个StackOverflow问题

我试图弄清楚如何告诉派生的yaml/store库允许加载不安全的YAML,或者提供我允许的类列表。

就我所能找到的文档而言,这是稀缺的,在阅读了它之后,这是我能想到的唯一合乎逻辑的尝试:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
# log.yml
:entries:
- :timestamp: 2018-07-09 00:00:00.000000000 +03:00
  :action: Comment
  :comment: Started logging

这在“精神病学4”中失败,而对“精神病学3”则成功。

代码语言:javascript
复制
# Gemfile
source "https://rubygems.org"
gem 'psych', '>= 4.0'    # fail
# gem 'psych', '< 4.0'   # pass

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

EN

回答 1

Stack Overflow用户

发布于 2022-03-02 18:57:42

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

代码语言:javascript
复制
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差异

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71322870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档