当升级到Rails 6.1.6.1时,我开始在应用程序中得到以下错误:
Psych::DisallowedClass:
Tried to load unspecified class: Symbol
这是由于在ActiveRecord列上使用Hash
序列化器导致的,该列使用符号作为键或值:
serialize :parameters, Hash
由于Rails中的以下安全更新而发生错误:https://discuss.rubyonrails.org/t/cve - 2022 - 32224 -可能-远端控制设备升级错误- -序列化列在活跃——record/81017
Hash
序列化器显然是用YAML.unsafe_load
加载数据,现在改成了YAML.safe_load
。出于安全原因,这个新方法默认不处理Symbol
或Time
等数据类型。
公告建议的解决方法是将序列化器迁移到JSON,或者在序列化中只使用安全的数据类型(字符串,数字)。
然而,有两个可配置的快速解决方案:config.active_record.use_yaml_unsafe_load
不建议这样做,因为它基本上会恢复到原来的行为。
或
config.active_record.yaml_column_permitted_classes = [Symbol]
允许序列化符号或其他不支持的(或不安全的)数据类型。
如果有人被困在这个问题上,上面建议的两个修复和Rails安全更新都没有为我在Rails5.2.8.1
上工作,我一直有同样的错误(Tried to load unspecified class: Symbol
),尽管允许它与application.rb
中的config.active_record.yaml_column_permitted_classes = [Symbol]
。最后,我不得不根据@ryan2johnson9的第一条评论调整unsafe_load选项以使其工作:
config.active_record.use_yaml_unsafe_load = true
我觉得这也很方便。
config.active_record.yaml_column_permitted_classes = [Symbol, Date]