如何为用户提供编写脚本的可能性(以安全的方式)?

时间:2017-08-08 13:16:27

标签: python

我目前遇到的问题是我需要编写一个接收字典的函数,其中所有值都是字符串或字典并输出字符串。问题是创建此输出字符串的逻辑。我想让用户写下逻辑。

现在,当然,我可以要求用户使用函数

创建一个有效的Python脚本
def generate_string(input_dict):
    # your logic
    return "some_string"

问题在于我不希望用户能够执行任意代码。特别是使用文件系统(读/写/删除文件)是不可能的。计算时间/内存使用量也应该有限制。

这可能吗?

目前,我让他们输入格式字符串。但这似乎太有限了,因为它错过了if陈述。

实施例

这只是一个极小的抽象例子:

def generate_string(input_dict):
    if input_dict['type'] == 1:
        return "I want my date in {d:%Y%m%d}".format(d=input_dict['date'])
    elif input_dict['type'] == 2:
        return "type is {}".format(input_dict['type'])
    return "some_string"

d = {'type': 1, 'date': datetime.date(2017, 1, 14)}
generate_string(d)

1 个答案:

答案 0 :(得分:2)

Python不是一种易于锁定的语言。由于它具有强大的内省api,因此阻止所有系统调用很难,甚至不可能。

我能想到的唯一安全方法是在单独的环境中运行脚本,例如docker容器或专用于运行脚本的vm。

也有pypy可以在沙盒模式下运行,但它仍然是原型,在完全可用之前可能需要更多的工作。

在python wiki上,有一个关于沙盒python的页面 https://wiki.python.org/moin/Asking%20for%20Help/How%20can%20I%20run%20an%20untrusted%20Python%20script%20safely%20%28i.e.%20Sandbox%29

PyPy沙盒: http://pypy.org/features.html#sandboxing

另外,请看一下How can I sandbox Python in pure Python?对这个问题有一个很棒的答案。