JSON for Python可以从文本文件中编码/解码函数吗?

时间:2015-08-09 14:22:29

标签: python json

我知道JSON适用于将复杂数据编码/解码到文本文件/从文本文件解码复杂数据,但是它还可以编码/解码文件中的函数吗?

1 个答案:

答案 0 :(得分:0)

您始终可以使用evalexec并将您的功能存储为纯文字:

>>> 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