Lua使表只读。

如何在 Lua 中将表设置为只读?(具体地说,是使用 LuaInterface 和 Lua 5.1 for C#,但我不认为这会改变什么) 我知道如何使用__index__newindex,但这不能防止某人运行: math = nil,这可能导致其他脚本错误执行。

我的当前“保护”函数:

function protect(table)
return setmetatable({}, { __index = table,
__newindex = function(table, key, value) error("attempted to modify a read only table")
end, __metatable = false }) end

math = protect(math)
math.sqrt = nil // 成功保护
math = nil // 这很糟糕,但可能会发生!
点赞
用户734069
用户734069

全局环境只是一个表格。在 Lua 5.1 中,每个函数(即编译后的 Lua 脚本)都有自己的环境,你可以通过 更改 来控制它。如果你想保护脚本,使其无法修改全局表格,你可以通过用沙箱环境 替换 它们的环境来实现。

基本上,你可以创建一个只读表格,将你想让它们能够访问的内容放入其中。你甚至可以设置元表,以防止覆盖现有元素,但允许他们修改当前不存在的条目(即:他们可以创建和使用自己的全局变量)。

话虽如此,除非你删除用户使用 rawget/ rawset 的能力,否则他们始终可以通过后门进入您的沙箱并开始破坏这些表格。

更安全的版本是通过复制函数来为每个脚本构建环境。不是每个脚本都获得相同的 math 表,而是获得原始表格的副本,你将其藏在脚本无法触及的地方。

2012-11-21 04:52:20