有没有一种安全的方法来使用eval在Perl中解开Data :: Dumper输出?

Tim*_*mmy 1 perl coding-style data-dumper

我有一个使用冻结数据的对象:

sub frozen_data {
    my $self = shift;

    $Data::Dumper::Indent = 0;
    $Data::Dumper::Terse  = 1;
    return Data::Dumper->Dump( [ $self->{_DATA}, ] );
}
Run Code Online (Sandbox Code Playgroud)

和相应的解冻:

sub thaw_data {
    my ($self) = @_;

    $self->{_DATA} = eval $self->{DATA};
}
Run Code Online (Sandbox Code Playgroud)

这似乎运作良好,有任何问题吗?我也试过通过perlcritic来运行它,我得到了这个:

Expression form of "eval" at line 69, column 22.  See page 161 of PBP.  (Severity: 5)
Run Code Online (Sandbox Code Playgroud)

写这个的更好的方法是什么?

bri*_*foy 8

你告诉Perl Critic STFU :)

 $self->{_DATA} = eval $self->{DATA}; ## no critic
Run Code Online (Sandbox Code Playgroud)

有时你需要做的事情通常只是一种不好的做法.

  • 用于制作诊断软件的+1.:d (3认同)

Gre*_*con 5

如果你正在解冻Data :: Dumper的输出,那就没办法了.另一种选择是可存储.

如果您接受不受信任的输入并将其取消选中eval,则应立即重新设计此机制,因为它会使前门敞开.对于编组内部数据,我不会说出警告.


Dan*_*Dan 5

只要您知道该数据的唯一来源是您自己使用Dumper创建的冻结数据,那么您没问题.

另一种方法是使用Dumper以外的东西,例如Storable.


yst*_*sth 5

确定要允许或禁止的内容并设置安全隔离专区并使用其reval方法.