查看文档,有一个使用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} );
使用Safe会对此有好处吗?我需要做的就是比较,没有磁盘访问或变量 *** 作.
解决方法 作为 indicated in the docs,eval($stmt)在当前Perl程序的词汇上下文中计算$stmt“,以便之后保留任何变量设置或子例程和格式定义.”这对于延迟执行$stmt直到运行时非常有用.如果你在Safe区间中重新计算($stmt),基本上会发生相同的事情,该语句是eval’d,但它在一个新的词汇上下文中得到了评估,该上下文只能看到Safe隔离专区的名称空间,并且你可以控制它允许哪种 *** 作符.
所以,是的,如果你在那个隔间中声明一个安全隔间和reval($stmt),那么(a)执行$stmt将不会在未经你同意的情况下改变你的程序的功能(我想这就是你的意思)没有来源滥用评估“).并且,(b)是,如果您重新评估($stmt),$stmt将无法在未经您同意的情况下访问磁盘.在(a)中“您的同意”要求明确地使用符号表,并且在(b)“您的同意”中需要指定一组允许磁盘访问的op codes.
我不确定这也是多么安全.但是,如果您在调试器中设置并逐步执行它,则可以看到它的运行情况.
总结以上是内存溢出为你收集整理的Perl:安全评估?全部内容,希望文章能够帮你解决Perl:安全评估?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)