Perl:安全评估?

Perl:安全评估?,perl,eval,Perl,Eval,我很好奇是否有关于执行受限评估的好信息 查看文档,有一个use-Safe有一个reval方法,但我不确定它有多安全 我想做的是能够将各种条件语句作为字符串传递给一个函数,而不是滥用eval的源代码 例如: sub foo { my $stmt = shift; my $a = 3; say eval($stmt)?"correct":"wrong") , "($stmt)"; } foo( q{1 == $a} ); foo( q{$a =~ /3/ ); foo(

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

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

我想做的是能够将各种条件语句作为字符串传递给一个函数,而不是滥用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}  );
使用保险柜
对这有好处吗?我所需要做的只是比较,不需要磁盘访问,也不需要变量操作。

As,
eval($stmt)
在当前Perl程序的词法上下文中计算
$stmt
,以便任何变量设置或子例程和格式定义都保留在后面。”这对于将
$stmt
的执行延迟到运行时非常有用

如果您
reval($stmt)
在一个隔间中,本质上会发生相同的事情,语句是eval'd,但它是在一个新的词汇上下文中eval'd的,该上下文只能看到安全隔间的名称空间,并且您可以控制允许哪些类型的运算符

因此,是的,如果您声明了一个安全分区并且
reval($stmt)
位于该分区中,那么(a)未经您同意执行
$stmt
不会改变程序的功能(我猜这就是您所说的“没有滥用eval的源代码”)。而且,(b)是的,
$stmt
如果您
reval($stmt)
,则在未经您同意的情况下将无法访问磁盘。在(a)“您的同意”中需要显式地使用符号表,在(b)“您的同意”中需要指定一组允许磁盘访问的符号表


我也不确定这有多安全。但是,如果您设置它并在调试器中逐步执行它,则可以看到它的实际操作。

Jason,thx。我所说的滥用eval的意思是注入代码来做一些破坏性的事情。Eval应该小心处理,但在本例中,我正在创建一个使用它的模块,因此我所能做的任何事情都将有助于提高它的安全性。我不得不相信codepad.org正在使用某种形式的小牛肉,如果你尝试
print`ls-l`
您得到
不允许的系统调用:SYS\u pipe
是的,这正是reval可以为您做的。我们在我们的应用程序中使用它,它本质上是一个小型编程环境。此外,配置文件直接包含perl数据结构,因此我们也使用它来确保在允许配置文件修改环境之前没有什么有趣的事情发生。谢谢Jason,您知道匿名子例程调用(我的最后一个示例)是否仍能运行吗?