我目前有一个问题,我需要编写一个接收字典的函数,其中所有值都是字符串或字典并输出一个字符串.问题是创建此输出字符串的逻辑.我想让用户编写逻辑.
当然,现在我可以要求用户使用函数创建一个有效的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)
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?对于同一个问题有一个很棒的答案。
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |