2016-11-30 122 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