我很好奇是否有任何关于执行受限评估的好信息。
查看文档,有一个具有reval
方法的use Safe
,但我不确定它有多安全。
我想要做的是能够将各种条件语句作为字符串传递给函数,而不是使用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} );
use Safe
对此有好处吗?我需要做的就是比较,不需要磁盘访问,也不需要变量操作。
发布于 2012-02-05 13:10:35
作为indicated in the docs,eval($stmt)
“在当前Perl程序的词法上下文中”计算$stmt
,这样任何变量设置或子例程和格式定义都会保留下来。这对于将$stmt
的执行延迟到运行时很有用。
如果你在一个Safe分区中执行reval($stmt)
,基本上也会发生同样的事情,语句是eval d的,但它是在一个新的词法上下文中求值的,该上下文只能看到安全分区的命名空间,并且您可以控制允许使用哪种类型的操作符。
所以,是的,如果您声明了一个安全分区并在该分区中使用了reval($stmt)
,那么(a)在未经您同意的情况下,执行$stmt
不会改变您程序的功能(我猜这就是您所说的“没有源代码滥用计算”的意思)。而且,(b)是的,如果您使用reval($stmt)
,则在未经您同意的情况下,$stmt
将无法访问磁盘。在(a)中,“您的同意”需要明确地处理符号表,而在(b)中,“您的同意”将需要指定一组允许磁盘访问的op codes。
我也不太确定这有多安全。但是,如果您设置它并在调试器中单步执行它,则可以看到它的实际效果。
https://stackoverflow.com/questions/9144902
复制相似问题