我知道JSON适用于将复杂数据编码/解码到文本文件/从文本文件解码复杂数据,但是它还可以编码/解码文件中的函数吗?
答案 0 :(得分:0)
>>> exec(compile("def f(a):\n print(a)", "exec", "exec"))
>>> f(2)
2
但是,我要强调,从不受信任的来源(如JSON文件)执行代码似乎是大红色警告标志。在没有冒险让任何能够访问您的JSON文件的人访问其他所有内容的情况下做到正确是很棘手的,即使这样,还有很多更好的方法可以做到这一点。
如果您不需要能够执行任意代码,更好的方式是Celery存储其任务的方式:存储函数的名称及其参数在JSON中。然后,您可以检查是否允许执行该函数,并将参数传递给它。如果你的功能设计不当,你仍然很容易受到攻击,但比任意代码要少得多。
首先,定义函数:
>>> def f(a):
... print(a)
使用名称和参数存储和检索JSON:
>>> json_data = {"name": "f", "args": ["hello world"]}
检查我们是否允许执行此操作:
>>> if json_data["name"] not in ["f"]:
... raise Exception("forbidden function!")
检索并执行函数:
>>> json_func = globals(json_data["name"])
>>> json_func(*json_data["args"])
hello world