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

Mar*_*oma 5 python

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

当然,现在我可以要求用户使用函数创建一个有效的Python脚本

def generate_string(input_dict):
    # your logic
    return "some_string"
Run Code Online (Sandbox Code Playgroud)

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

这可能吗?

目前,我让他们输入格式字符串.但这似乎太有限了,因为它错过了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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 2

Python 并不是一门容易锁定的语言。由于它具有强大的内省 API,因此即使不是不可能,也很难阻止所有系统调用。

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

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

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

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

另外,请查看如何在纯 Python 中沙箱 Python?对于同一个问题有一个很棒的答案。