Edited at

YAML.load を YAML.safe_load に書き換えると Psych::BadAlias エラーが発生する

More than 1 year has passed since last update.


問題

RSpec のコードで Rubocop の "Block has too many lines." という警告を無視したい に引き続き、Rubocop のバージョン更新でひっかかったこと 2 つ目です。

Rubocop を実行すると Security/YAMLLoad という cop に怒られました :cop_tone1:

Prefer using YAML.safe_load over YAML.load.

YAML.load にはセキュリティ上の問題があるため、YAML.safe_load に書き換えろという内容です (参考 PR) 。

Rubocop の自動修正で YAML.loadYAML.safe_load に修正したのですが、修正したコードを実行すると次のエラーが発生しました。

file = Rails.root.join('config/database.yml').read

YAML.safe_load(file)
#=> Psych::BadAlias: Unknown alias: default

これは Rails の config/database.yml を読み込むコードなのですが、YAML ファイル内で &default という名前の エイリアス を使っているのが原因のようです。ただ、エイリアス自体は YAML の機能ですし、YAML ファイルの文法も間違っていません。


解決策

YAML.safe_load(file, [], [], true)

#=> Hash object

のように、エイリアス機能を利用するには YAML.safe_load の第 4 引数に true を渡す必要がありました。詳しくは YAML.safe_load のドキュメント を参照してください。