純粋な Perl YAML 実装 (YAML
ではなくモジュールYAML::Syck
) には、深刻な問題があるようです。最近、非常に長い行 (32k 文字程度) を含む YAML ドキュメントを処理できないという問題に遭遇しました。
YAML は、bless された変数を保存およびロードすることができ、デフォルトで実行されます (以下のスニペット*sepia-repl*
は Emacs のバッファーからコピーされたものです)。
I need user feedback! Please send questions or comments to seano@cpan.org.
Sepia version 0.98.
Type ",h" for help, or ",q" to quit.
main @> use YAML
undef
main @> $foo = bless {}, 'asdf'
bless( {}, 'asdf' )
main @> $foo_dump = YAML::Dump $foo
'--- !!perl/hash:asdf {}
'
main @> YAML::Load $foo_dump
bless( {}, 'asdf' )
DESTROY
信頼されていないデータを使用して、アプリケーションで定義された任意のメソッド (またはアプリケーションが使用する任意のモジュール)を呼び出すことができるため、これはセキュリティ上非常に恐ろしいことです。
次の短いプログラムは、問題を示しています。
#!/usr/bin/perl
use YAML;
use Data::Dumper;
package My::Namespace;
sub DESTROY {
print Data::Dumper::Dumper \@_;
}
package main;
my $var = YAML::Load '--- !!perl/hash:My::Namespace
bar: 2
foo: 1
';
JSON はデフォルトではこれを許可しません。Perl の「オブジェクト」をシリアライズすることは可能ですが、そのためには TO_JSON メソッドを定義する必要があります。