评估()。这很危险吗?

EVAL(). Is this dangerous?

好吧,几乎所有人都说 eval 是邪恶的,这在 99% 的情况下都是正确的...但我来这里是想问一下我写的一些代码使用 eval,所以,这很危险吗?

我尝试尽可能多地清理数据,同时保持原始功能,但这利用了 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.

这是调用LPclass中的一些方法。

我已经尝试将我的 LANG 系统变量更改为任何可能损害我的 PC 的字符串,例如 rm -rf / 或类似的字符串,但是,因为我的代码删除了LANG var & 的最后 5 个字符在开头添加 LP. 并在结尾添加 (),结果是这样的,没有提到它从头开始检查是否最后 5 个字符字符串是 UTF-8,但如果我删除那个条件,这应该是 "harmful" 命令:

LP.rm -r()

到目前为止,我注意到任何超过 5 个字符的命令都无法绕过 "remove last 5 characters" 代码行,并且添加的 LP. & ()应该足以抵消任何伤害企图。

到现在为止,我将保留“.UTF-8”以避免任何严重错误...

我在这里根本看不出 eval 的任何理由。

您正在尝试获取 LP 上与 LANGUAGE 设置相对应的方法。所以,你可以使用 getattr:

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

请注意,无需多次执行 rstrip 操作:

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