Lua只读桌子

0 c# security scripting lua sandbox

如何在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 // successfully protected
math = nil // this is bad and can happen!
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

全球环境只是一张桌子.在Lua 5.1中,每个函数(编译的Lua脚本都是这样)都有自己的环境,您可以更改它.如果您想要沙箱脚本以便它们无法修改全局表,您可以通过沙盒替换它们的环境来实现.

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

话虽这么说,除非你删除用户rawget/ 的能力rawset,他们总是可以回到你的沙箱后面并开始打破这些表.

更安全的版本是通过复制函数为每个脚本构建环境.而不是每个脚本获得相同的math表,他们得到原始的副本,你已经脚本无法触及的地方.