首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl:安全的评估?

Perl:安全的评估?
EN

Stack Overflow用户
提问于 2012-02-05 05:54:48
回答 1查看 1.3K关注 0票数 4

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

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

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

例如:

代码语言:javascript
运行
复制
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对此有好处吗?我需要做的就是比较,不需要磁盘访问,也不需要变量操作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-05 13:10:35

作为indicated in the docseval($stmt)“在当前Perl程序的词法上下文中”计算$stmt,这样任何变量设置或子例程和格式定义都会保留下来。这对于将$stmt的执行延迟到运行时很有用。

如果你在一个Safe分区中执行reval($stmt),基本上也会发生同样的事情,语句是eval d的,但它是在一个新的词法上下文中求值的,该上下文只能看到安全分区的命名空间,并且您可以控制允许使用哪种类型的操作符。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9144902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档