Perl:安全评估?

vol*_*ron 5 perl eval

我很好奇是否有任何有关执行受限评估的好信息。

查看文档,有一个use Safereval方法,但我不确定它有多安全。

我想要做的是能够将各种条件语句作为字符串传递给函数,而无需滥用 eval 的源。

例如:

sub foo {
   my $stmt = shift;
   my $a    = 3;
   say eval($stmt)?"correct":"wrong") , "($stmt)";
}

foo( q{1  == $a} );
foo( q{$a =~ /3/ );
foo( q{(sub {return 3})->() eq 3}  );
Run Code Online (Sandbox Code Playgroud)

use Safe这样会有好处吗?我需要做的就是比较,无需磁盘访问或变量操作。

Jas*_*son 4

文档中所示eval($stmt)评估$stmt“在当前 Perl 程序的词法上下文中,以便随后保留任何变量设置或子例程和格式定义”。这对于延迟执行直到运行时很有用$stmt

如果您reval($stmt)安全隔间中,本质上会发生相同的事情,该语句将被评估,但它是在新的词法上下文中评估的,该上下文只能看到安全隔间的名称空间,并且您可以在其中控制运算符的类型允许。

所以,是的,如果您声明一个安全隔间并reval($stmt)在该隔间中,那么(a)$stmt在未经您同意的情况下执行不会改变程序的功能(我想这就是您所说的“没有滥用源的源”的意思评估”)。并且,(b) 是的,$stmt如果您不同意,则在未经您同意的情况下将无法访问该磁盘reval($stmt)。在 (a) 中,“您的同意”需要明确地使用符号表,而在 (b) 中,“您的同意”则需要指定一组允许磁盘访问的操作码。

我也不确定这有多安全。但是,如果您在调试器中对其进行设置并单步执行,则可以看到它的运行情况。