我正在研究一个可本地化的 Lua 字符串解决方案,当我想出这个 hack 时,问题是我不知道如何避免被它攻击:) 所以我想知道是否有人做过类似的事情,或者知道如何防范这种攻击。 (在用户代码中)
既然我们可以做到这一点:
=("foo"):upper() -->output: FOO
它可以像这样被黑客攻击:
getmetatable("foo").__index.upper = function() print("bye bye sucker");os.exit() end
=("foo"):upper() -->output: bye bye sucker (application quits)
-- or this way
=string.upper("bar") -->output: bye bye sucker (application quits)
有什么想法吗?
最佳答案
首先也是最重要的是,仅在沙盒环境中执行不受信任的代码 - 正如其他发帖者所说。除了加载字节码 block 之外,Lua 还允许涵盖所有其他沙箱问题。 (字节码 block 问题一旦发现就会立即得到修复。)
参见Lua Live Demo举个沙盒的例子。来源可用here .
您的元表具体问题可以通过设置 __metatable
来解决字段:
If you set a
__metatable
field in the metatable,getmetatable
will return the value of this field, whereassetmetatable
will raise an error.– Roberto Ierusalimschy, Programming in Lua 1st edition, 13.3 - Library-Defined Metamethods
例如:
> mt = { __metatable = true }
> t = {}
> setmetatable(t, mt)
> setmetatable(t, mt)
stdin:1: cannot change a protected metatable
stack traceback:
[C]: in function 'setmetatable'
stdin:1: in main chunk
[C]: ?
所以,您所要做的就是:
getmetatable("").__metatable = true
关于security - Lua 中有没有办法避免这个安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/325323/