Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Exec():限制访问_Python 3.x_Security_Exec_Return Value - Fatal编程技术网

Python 3.x Exec():限制访问

Python 3.x Exec():限制访问,python-3.x,security,exec,return-value,Python 3.x,Security,Exec,Return Value,我将源代码放入数据库,然后调用Exec()函数。用户将无法直接访问此代码,但为了安全起见,我将仅将我的功能限制为您真正需要的功能。我使用了以下代码: exposed_methods = {'rule': rule, 'print': print, 'return': 'return'} exec([CODE_STRING], {'__builtins__': None}, exposed_methods) 但这太有限了,我似乎无法重新编辑内存中的变量或返回某些内容。下面是一个简单的测试: st

我将源代码放入数据库,然后调用Exec()函数。用户将无法直接访问此代码,但为了安全起见,我将仅将我的功能限制为您真正需要的功能。我使用了以下代码:

exposed_methods = {'rule': rule, 'print': print, 'return': 'return'}
exec([CODE_STRING], {'__builtins__': None}, exposed_methods)
但这太有限了,我似乎无法重新编辑内存中的变量或返回某些内容。下面是一个简单的测试:

string = """
if rule.test(True):
    variable_test = 'test1.1'
    return 'test1.2'
else:
    variable_test = 'test2.1'
    return 'test2.2'
"""

exposed_methods = {'rule': rule, 'print': print, 'return': 'return'}
exec(string, {'__builtins__': None}, exposed_methods)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第3行 SyntaxError:外部的“返回” 作用


变量不在内存中,方法不返回found

,因此真正的直接问题是“在函数外返回”,而不是“限制访问”。如果使用基本形式的
exec
,这一点不会改变。无论如何,可能传入一个可变的“context”对象<代码>上下文={'returnValue':无}。(而且
return
不是一个函数,所以只需完全删除即可.)@user2864740我无法设置变量,它没有创建或更改。如果拆下限制器,这将正常工作。我不想无限期地启动这个系统,它是为一个伟大的客户准备的。
exposed_方法={'rule':rule,'print':print,'context':context}
--请参见上面的“context”,如何使用它。或者,考虑一些类似于<代码>公开的方法= {“规则”:规则,“打印”:打印,“StestRealValue:”这个函数。非常感谢你的例子,你能做出一个“真实”的评论来标记为有效的回应吗?