0

如何在 Lua 中将表设为只读?(特别是用于 C# 的 LuaInterface 与 Lua 5.1,但我认为这不会改变任何东西)我知道如何使用__indexand __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 // successfully protected
math = nil // this is bad and can happen!
4

1 回答 1

5

全球环境只是一张桌子。在 Lua 5.1 中,每个函数(即编译好的 Lua 脚本)都有自己的环境,您可以更改. 如果您想对脚本进行沙盒处理以使其无法修改全局表,您可以通过其环境替换为沙盒环境来实现。

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

话虽如此,除非您取消用户使用rawget/的能力,否则rawset他们总是可以为您的沙箱提供后门并开始破坏这些表。

一个更安全的版本是通过复制函数来为每个脚本构建一个环境。他们不是每个脚本都获得同math一张表,而是获得原始副本的副本,您将这些副本隐藏在脚本无法触及的地方。

于 2012-11-21T04:52:20.707 回答