2012-02-04 30 views
4

我很好奇,如果有任何有關執行限制性演示的好信息。Perl:safe 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(q{(sub {return 3})->() eq 3} ); 

use Safe是良好的嗎?我所需要做的就是比較,無需磁盤訪問或可變操作。

回答

4

作爲indicated in the docseval($stmt)「在當前Perl程序的詞彙上下文中,這樣任何變量設置或子程序和格式定義保持算賬。」的計算結果$stmt這有助於延遲執行$stmt直到運行時。

如果reval($stmt)Safe隔間,本質上是相同的事情發生,該語句eval'd,但它在一個新詞彙的上下文只能看到安全艙的命名空間eval'd,並在其中你可以控制什麼樣的運營商是允許的。因此,如果您在該隔間中聲明安全隔間和reval($stmt),則(a)執行$stmt不會在未經您同意的情況下更改您的程序的功能(我想這就是您所說的「w/o濫用eval的來源「)。並且,(b)是的,$stmt將在未經您的同意的情況下無法訪問磁盤,如果您reval($stmt)。 (a)「您的同意」要求明確使用符號表,並且(b)「您的同意」需要指定一組允許訪問磁盤的op codes

我不太確定這是多麼安全。但是,如果在調試器中對其進行設置並逐步執行,則可以看到它在運行。

+0

Jason,thx。我濫用eval的意思是注入代碼來做破壞性的事情。應該小心處理Eval,但是在這種情況下,我正在創建一個可以使用它的模塊,所以無論我如何使它更安全都會有所幫助。我必須相信,codepad.org正在使用某種形式的小牛肉,如果您嘗試使用'print \'ls -l \';'您會得到'不允許的系統調用:SYS_pipe' – vol7ron 2012-02-05 22:22:16

+0

是的,這正是reval可以爲您做的。我們在我們的應用程序中使用它,它基本上具有迷你編程環境。此外,配置文件直接包含perl數據結構,因此我們也使用它來確保在允許配置文件修改環境之前沒有什麼好玩的。 – Jason 2012-02-06 04:19:55

+0

謝謝Jason,你知道匿名子程序調用(我的最後一個例子)是否仍然可以運行? – vol7ron 2012-02-06 04:59:30