You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:50:35