【问题标题】:Python, excel, eval and the cardinal sinsPython、excel、eval 和大罪
【发布时间】:2020-08-29 20:07:12
【问题描述】:

好的,所以我知道之前已经在许多不同的线程中问过这个问题,但我发现自己仍在努力减少我的疑虑。

我有一个应用程序,它允许用户传递字符串字典并从库中“选择”一个后端函数来处理它。这些函数是“工作流”库的一部分,由系统管理员在后端加载。可用函数存储在后端的清单文件中。

机制是这样的,用户将字典作为 json 发送到 Web 应用程序,并指定库中的哪个函数应该处理它。然后通过 python exec() 或 eval() 函数加载并执行该函数。

在执行之前,根据清单文件中的可用函数列表(白名单)检查请求的函数。

我的基本问题是,白名单可以使 exec() 和 eval 安全吗?它可以变得“更安全”吗?

【问题讨论】:

    标签: python security exec eval


    【解决方案1】:

    如果我理解的话,该函数是受管理员信任的,这使它与您安装的任何 python 模块一样安全。只需确保 exec 部分仅在受信任的代码上完成。这是一个加载并执行与其文件同名的函数的示例。

    import json
    from pathlib import Path
    
    # files named the same as the function, no .py
    FUNCTION_DIR = Path("/my/functions/are/here")
    
    def run_func(name, data):
        try:
            func_namespace = {}
            exec(open(FUNCTION_DIR/name).read(), func_namespace)
            return func_namespace[name](json.dumps(data)) 
        except Exception as e:
            return "Hey, what kind of game are you playing here? " + str(e)
    

    该函数自然被列入白名单,因为它位于已知安全目录中。

    【讨论】:

    • 谢谢,有道理。就我而言,我使用 .yaml 文件,其中包含“允许”模块和函数的列表。更准确地说,我在跑步; exec('import ') 然后 eval(' mydict') ,其中 字符串在调用 exec/eval 之前针对 manifest.yaml 进行测试。跨度>
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 2019-10-26
    • 1970-01-01
    • 2014-01-20
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多