【问题标题】:EVAL(). Is this dangerous?评估()。这很危险吗?
【发布时间】:2016-11-30 09:01:31
【问题描述】:

嗯,几乎每个人都说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编写。

它的作用是调用LP 类中的一些方法。

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

LP.rm -r()

到目前为止,我已经注意到任何超过 5 个字符的命令都无法绕过“删除最后 5 个字符”的代码行,并且添加的 LP. 和 () 应该足以抵消任何企图伤害。

到目前为止,我会保留“.UTF-8”以避免任何严重错误...

【问题讨论】:

    标签: python python-2.7 internationalization eval rm


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这可以正常工作。不知道endswitch 和getattr,使用这些会更好。这么快的反应,谢谢! P.S:eval 100% 可以用其他命令替换吗?或者有时它是唯一的解决方案?
    • 我敢肯定,有时它是唯一的解决方案,否则它根本不会是语言。不过,它们应该相当罕见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2011-04-20
    • 2010-09-28
    • 2016-08-08
    相关资源
    最近更新 更多