Python 3.x Exec():限制访问
我将源代码放入数据库,然后调用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
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:”这个函数。非常感谢你的例子,你能做出一个“真实”的评论来标记为有效的回应吗?