如何配置Lupa限制Lua代码访问Python对象/函数?属性过滤失效求助
彻底阻止Lupa中Lua代码访问Python的方案
1. 移除Lua全局环境中的python对象
Lupa默认会在Lua全局环境注入python对象,这是用户代码能直接调用python.iter的核心原因。可以通过两种方式移除:
方式一:初始化时指定空Lua全局环境
创建LuaRuntime时,通过globals参数传入空字典,避免默认注入python对象:
def filter_attribute_access(obj, attr_name, is_setting): raise AttributeError('access denied') lua_no_py = lupa.LuaRuntime( register_eval=False, attribute_filter=filter_attribute_access, python_globals={}, # 限制Python全局环境为空 globals={} # 清空Lua全局变量,不包含默认的`python`对象 )
方式二:初始化后手动删除python变量
如果需要保留Lua自身的默认全局函数(如字符串、表操作),可以在初始化后移除python对象:
lua_no_py = lupa.LuaRuntime( register_eval=False, attribute_filter=filter_attribute_access, python_globals={} ) # 删除Lua全局环境中的python对象 del lua_no_py.globals()['python']
2. 限制传入Python对象的属性访问
你定义的attribute_filter已经能拦截Lua对传入Python对象的属性/方法访问,包括__iter__这类特殊方法。只要python全局对象被移除,用户无法通过python.iter绕开过滤器,直接访问传入对象的方法会被拦截。
3. 验证限制生效的测试用例
测试1:尝试调用python全局对象的方法
运行后应抛出LuaError,提示python未定义:
try: lua_no_py.eval('python.iter({1,2,3})') except lupa.LuaError as e: print("测试1通过:", e) # 预期输出包含"python is nil"类信息
测试2:传入Python对象并尝试访问其方法
运行后应抛出AttributeError:
obj = [1,2,3] try: lua_func = lua_no_py.eval('function(py_obj) return py_obj.__iter__() end') lua_func(obj) except AttributeError as e: print("测试2通过:", e) # 预期输出"access denied"
测试3:尝试访问Python内置函数
运行后应抛出LuaError或AttributeError:
try: lua_no_py.eval('python.print("test")') except (lupa.LuaError, AttributeError) as e: print("测试3通过:", e)
额外注意事项
- 不要主动将Python对象注入Lua环境(如
lua_no_py.globals()['obj'] = some_py_obj),若需开放部分属性,可修改attribute_filter做白名单处理。 - 若要保留Lua自身安全函数,优先用方式二删除
python变量,方式一的globals={}会清空所有Lua默认全局变量,需手动添加允许的函数。
内容的提问来源于stack exchange,提问作者silly_face_
相关产品推荐
相关产品推荐

