我需要一个函数,它将python的运算符符号或关键字之一作为字符串,连同其操作数,对其进行求值,并返回结果.像这样:
>>> string_op('<=', 3, 3)
True
>>> string_op('|', 3, 5)
7
>>> string_op('and', 3, 5)
True
>>> string_op('+', 5, 7)
12
>>> string_op('-', -4)
4
Run Code Online (Sandbox Code Playgroud)
不能认为该字符串是安全的.我只对映射二元运算符感到满意,但如果能得到所有这些运算符,我会非常高兴.
import operator
def string_op(op, *args, **kwargs):
"""http://docs.python.org/2/library/operator.html"""
symbol_name_map = {
'<': 'lt',
'<=': 'le',
'==': 'eq',
'!=': 'ne',
'>=': 'ge',
'>': 'gt',
'not': 'not_',
'is': 'is_',
'is not': 'is_not',
'+': 'add', # conflict with concat
'&': 'and_', # (bitwise)
'/': 'div',
'//': 'floordiv',
'~': 'invert',
'%': 'mod',
'*': …Run Code Online (Sandbox Code Playgroud) 我目前有一个问题,我需要编写一个接收字典的函数,其中所有值都是字符串或字典并输出一个字符串.问题是创建此输出字符串的逻辑.我想让用户编写逻辑.
当然,现在我可以要求用户使用函数创建一个有效的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 3.6,我想在脚本中禁用导入命令以防止用户导入任何 Python 内置库。我只想使用语言本身和我自己的 C++ 定义的模块。
Py_SetProgramName (L"Example");
Py_Initialize ();
PyObject* mainModule = PyImport_AddModule ("__main__");
PyObject* globals = PyModule_GetDict (mainModule);
// This should work
std::string script1 = "print ('example')";
PyRun_String (script1.c_str (), Py_file_input, globals, nullptr);
// This should not work
std::string script2 = "import random\n"
"print (random.randint (1, 10))\n";
PyRun_String (script2.c_str (), Py_file_input, globals, nullptr);
Py_Finalize ();
Run Code Online (Sandbox Code Playgroud)
你知道有什么方法可以实现这一目标吗?
我有兴趣在某种沙盒中使用pytest执行可能不受信任的测试,比如docker,类似于持续集成服务.
我理解为了正确沙箱化一个python进程你需要操作系统级别的隔离,比如在一次性chroot /容器中运行测试,但在我的用例中,我不需要防止故意恶意代码,只是来自配对的危险行为带参数的"随机"函数.因此,较不严格的沙箱仍然可以接受.但我没有找到任何能够实现任何形式沙盒的插件.
沙盘测试在pytest中执行的最佳方法是什么?
更新:这个问题是不是在一般的蟒蛇沙盒作为测试代码由pytest运行,我不能改变它执行使用方式exec或ast或什么的.不幸的是,使用pypy-sandbox也不是一个选项,因为根据PyPy功能页面它只是"原型" .
更新2:pytest-dev邮件列表中的Hoger Krekel 建议使用专用的testuser通过pytest-xdist进行用户级隔离:
py.test --tx ssh=OTHERUSER@localhost --dist=each
Run Code Online (Sandbox Code Playgroud)
这让我意识到我的CI用例:
具有"一次性"环境与具有隔离的环境一样重要,因此每个测试或每个会话都从相同的初始状态运行,并且不会受到testuser可写入的文件夹上旧的会话可能留下的影响(/ home/testuser,/ tmp,/ var/tmp等).
因此testuser + xdist接近于解决方案,但并不完全存在.
只是为了上下文我需要隔离来运行pytest-nodev.
我正在编写一个应用程序,我们需要在其中执行不受信任的 Python 代码。(即类似于家庭作业提交服务器的应用程序,其中学生输入不受信任)
考虑一下,我的第一个想法是通过禁用语言的文件 I/O 功能(因此,将代码限制为仅使用 stdin/stdout),程序不会对系统造成太大伤害。
这是正确的,还是有我没有想到的攻击媒介?
我可以传递某种 python 标志或编译器选项来隔离代码吗?