纯 Perl YAML 实现(YAML
相对于模块YAML::Syck
)似乎有一些严重的问题。我最近遇到了无法处理行很长(大约 32k 个字符)的 YAML 文档的问题。
YAML 能够存储和加载祝福变量,并且默认情况下这样做(下面的代码片段是从*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 方法。