2010-02-25 72 views
2
def myFunc(arg1, arg2): 
    print "This is a test with " + arg1 + " and " + arg2 

while (input != "quit"): 
    input = raw_input("> ") 

    if input != "quit": 
     eval(input) 

此代碼給我一個提示,允許我用我想要的參數調用myFunc。我知道,如果沒有提供字典eval可能是危險的,所以我加了這一點:使用eval安全地執行功能

eval(input, {"__builtins__": {} } 

現在我可以不再調用myFunc。我如何解決這個問題,而不會讓eval開放利用?

+0

@ S.Lott,'eval'總是引入一個安全漏洞,但不是那個特定的安全漏洞;語句(包括'import')不能在只評估表達式的'eval'中執行。 – 2010-02-25 18:44:36

+0

@Mike:注意'__import__'函數:http://docs.python.org/library/functions.html#__import__ – 2010-02-25 19:13:43

+3

**沒有辦法使'eval'安全。**只需隱藏內建函數甚至沒有開始解決這個問題。例如,撤銷代碼可以很容易地從myFunc.func_globals ['__ builtins __']'中取回它們。 – bobince 2010-02-25 19:23:36

回答

1

這將允許您使用myFunc

eval(input, {"__builtins__": {}, "myFunc": myFunc}) 

然而,正如其他人所指出的那樣,使用eval本質上是不安全,而且還vulnerabe戰功。

+1

這確實可以訪問'myFunc',但並未完成執行該功能的總體目標牢固。 'eval'不能用於此,特別是不容易。 – 2010-02-25 19:31:53

1

您的問題「我如何解決這個問題,而不會讓eval開放給漏洞利用?」,是不正確的 - eval很容易受到漏洞攻擊。不將__builtins__引入評估代碼的全局名稱空間不會使__builtin__模塊無法訪問,並且不會關閉其他入口點。

如果您更多地解釋了您試圖解決的問題,有人可能會提出一個安全選項來實現您的目標。

+0

我知道有更安全的選擇,但我有一個學校作業,說我必須在這個特定的腳本中使用'eval'(儘管我仍然可以讓它處理'''* 10000000',這樣Python就會變得瘋狂) 。 – Pieter 2010-02-26 08:33:36

+0

好的,請記住,即使使用上面的代碼,由於您使用'eval'卡住,您的腳本將容易受到包括不可能長時間計算在內的攻擊以及針對您的願望訪問'__builtins__'的攻擊。如果你希望安全地執行任意Python代碼,你可以在操作系統級上對沙盒解釋器進行沙盒處理,並在監督器下運行它,就像他們在http://codepad.org/上一樣,但我懷疑你真的很在意去解決這個問題爲你的任務。 – 2010-02-26 16:14:12

0

如果您需要演示如何eval仍然是危險的,即使刪除了內置程序,請參閱:Eval really is dangerous。有一些例子可以讓CPython解釋器或者直接退出CPython解釋器。