现在我正在做很多事情。
local env = {
print = print,
}
setfenv(函数,环境)
然后使用元方法来锁定实例上的属性,但它确实效率低下并且有很多绕过。我用谷歌搜索了它,我发现的一切都与此相同:不起作用。
在 Lua 5.1 中,沙箱非常简单。如果某个文件中有一个 Lua 脚本,并且您想阻止它访问除您提供的参数之外的任何函数或任何内容,您可以这样做:
local script = --Load the script via whatever means. DO NOT RUN IT YET!
setfenv(script, {})
script
现在已沙盒化。除了您直接提供的值之外,它无法访问任何其他内容。它创建的函数无法访问此沙箱环境之外的任何内容。你原来的全球环境与它们完全隔绝,除非你允许它访问。
显然,您可以在该表中放置任何您喜欢的内容;该表将包含您喜欢的任何全局可访问的内容。你或许应该让 Lua 脚本访问基本的 Lua 标准库函数;其中大部分都是纯函数,不能做任何令人不快的事情。
这是您可以使用的 Lua 标准库内容的列表must not如果您想保持沙箱的完整性,请授予用户访问权限:
-
getfenv
。用户有充分的理由能够setfenv
,这样它就可以在您的沙箱中创建自己的迷你沙箱。但是,如果您想维护沙箱的完整性,则不能允许访问您放入沙箱中的任何函数的环境。
-
getmetatable
:与上面的推理相同;设置元表就可以了。虽然恶意代码如果更改其元表就可以破坏对象,但恶意代码只需执行无限循环就可以破坏整个系统。
- The entire debug图书馆。通过调试库可以进行各种欺骗。
您显然还需要解决Lua 5.1 在从 Lua 脚本中加载字节码时存在这个问题。这可以用来破坏沙箱。不幸的是,Lua 5.1 并没有真正为此提供好的工具。在Lua 5.2+中,可以封装load
and loadfile
,这样无论用户提供什么,您都可以在内部传递“t”作为模式参数。但是对于Lua 5.1,你需要一些方法来封装load
等人。这样您就可以辨别数据何时是文本,何时不是。通过阅读 Lua 源代码,您可能会找到 Lua 用于区分字节码和文本的代码。
或者你可以直接禁止load
和它的朋友们。
如果你想阻止用户对系统做一些丑陋的事情,那么就禁止os
and io
图书馆。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)