假设我使用 register_eval=False
创建了一个 LuaRuntime
,并且使用 attribute_filter
阻止访问除了一些Python函数之外的任何内容。那么可以安全地假设 Lua 代码将无法执行类似于 os.system("rm -rf *")
的操作吗?
假设我使用 register_eval=False
创建了一个 LuaRuntime
,并且使用 attribute_filter
阻止访问除了一些Python函数之外的任何内容。那么可以安全地假设 Lua 代码将无法执行类似于 os.system("rm -rf *")
的操作吗?
从查看Lupa文档:
限制Lua访问Python对象
Lupa提供了一种简单的机制来控制对Python对象的访问。可以通过一个过滤函数来传递每个属性访问,如下所示...
它没有说明如何防止或限制Lua本身提供的功能。如果在LuaRuntime
环境中没有进行其他修改,则Lua脚本确实可以执行诸如os.execute("rm -rf *")
之类的操作。
要控制Lua脚本工作的环境类型,可以在运行之前使用setfenv
和getfenv
来沙盒化脚本。例如:
import lupa
L = lupa.LuaRuntime()
sandbox = L.eval("{}")
setfenv = L.eval("setfenv")
sandbox.print = L.globals().print
sandbox.math = L.globals().math
sandbox.string = L.globals().string
sandbox.foobar = foobar
# etc...
setfenv(0, sandbox)
现在执行像L.execute("os.execute('rm -rf *')")
这样的操作将导致脚本错误。