问题描述
好吧,所以我知道以前在许多不同的线程中都曾问过这个问题,但我发现自己仍在努力减少怀疑。
我有一个允许用户传递字符串字典并从库中“选择”后端函数进行处理的应用程序。这些功能是“工作流”库的一部分,并由系统管理员在后端加载。可用功能存储在清单文件的后端。
机制如此,用户可以将字典作为json发送到Web应用程序,并指定库中的哪个函数应对其进行处理。然后通过python exec()或eval()函数加载并执行该函数。
在执行之前,对照清单文件中的可用功能列表(白名单)检查所请求的功能。
我的基本问题是,将白名单列入exec()和eval可以安全吗?可以使它“更安全”吗?
解决方法
据我了解,该功能受到管理员的信任,这使其与您安装的任何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)
该函数自然被列入白名单,因为它位于已知安全的目录中。