好吧,几乎每个人都说eval
是邪恶的,99%的情况都是如此......但我在这里问一些代码我和#39; ve写道使用eval
,SO,这有危险吗?
我尽可能地尽可能地清理数据,同时保持原有的功能,但是这会使用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
类中的一些方法。
我已经试图弄乱我的电脑试图将我的LANG
系统变量更改为任何可能损害我的电脑的字符串,例如rm -rf /
或类似的,但是,因为我的代码删除了LANG
var&的最后5个字符在开头添加LP.
,在结尾添加()
,结果是这样的,没有提到它从头开始检查字符串的最后5个字符是UTF-8
,但如果我删除这种情况应该是"有害的"命令:
LP.rm -r()
到目前为止,我已经注意到任何超过5个字符的命令都无法绕过"删除最后5个字符"代码行,以及添加的LP.
& ()
应足以抵消任何伤害企图。
直到现在,我将保留" .UTF-8"避免任何严重错误...
答案 0 :(得分:3)
我根本看不到eval
的任何原因。
您正试图在LP
上获取与LANGUAGE设置相对应的方法。因此,您可以使用getattr
:
meth = getattr(LP, Language)
result = meth()
请注意,没有必要多次执行rstrip
内容:
lang = os.environ["LANG"].rstrip('''\n''')
if lang.endswith(".UTF-8"):
...