2016-11-30 165 views
0

好了,幾乎每個人都在那裏說eval是邪惡的,這是對的情況下,99%的真...但我在這裏問一些一段代碼,我寫了一個使用eval,SO,這是危險嗎?EVAL()。這是危險的嗎?

我試圖清理數據,最有可能,同時保持原有的funtionality,但是這使得eval使用和東西可以去錯了:

import os 

try: 
    if os.environ["LANG"].rstrip('''\n''')[5:] == ".UTF-8": 
     Language = str(os.environ["LANG"].rstrip('''\n''').rstrip(os.environ["LANG"].rstrip('''\n''')[5:])) 
     eval (str("LP." + Language + "()")) 
    else: 
     raise Exception("Not an UTF-8 locale") 
except KeyError: 
    LP.Fallback() 
except AttributeError: 
    LP.Fallback() 

首先,該代碼應該下運行UNIX和衍生物。

中寫道python2.7。

這樣做是調用LP類中的一些方法。

我alredy試圖搞砸了我的電腦想我LANG系統變量更改爲可能損害我的電腦,像rm -rf /或同類者任意字符串,但是,因爲我的代碼刪除LANG VAR &的最後5個字符增加LP.開始和()末,它的結果是這樣,就不能不提,它從一開始檢查,如果該字符串的最後5個字符是UTF-8,但如果我刪除條件,這應該是「有害」的命令:

LP.rm -r()

到現在爲止,我已經注意到d,任何命令超過5個字符長將無法繞過的代碼的「刪除最後5個字符」線,並且所添加的LP. & ()應足以中和傷害的任何嘗試。

直到現在,我會保持」 .UTF-8" ,以避免任何嚴重的錯誤......

回答

3

我看不到任何理由eval這裏的。

你正在試圖獲得的方法上LP對應的語言設置。所以,你可以使用getattr

meth = getattr(LP, Language) 
result = meth() 

注意有沒有必要做rstrip東西,所以很多次:

lang = os.environ["LANG"].rstrip('''\n''') 
if lang.endswith(".UTF-8"): 
    ... 
+0

這個工作,因爲它應該。不知道'endswitch'和'getattr',事情對這些工作更好。如此快速的迴應,謝謝! P.S:'eval' 100%可以用其他命令替換嗎?或者有時它是唯一的解決方案? – PythonNoob

+1

我相信有時候它是唯一的解決方案,否則它不會在語言中。他們應該是相當罕見的。 –

+0

好的,感謝所有這些信息。 – PythonNoob