我正在研究一个可本地化的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)
有任何想法吗?
首先,最重要的是在沙盒环境中执行不受信任的代码 - 正如其他海报所说的那样.除了加载字节码块之外,Lua还允许涵盖所有其他沙盒问题.(并且字节码块问题会在发现后立即得到修复.)
有关沙盒的示例,请参阅Lua Live Demo.来源可在此处获得.
通过设置__metatable
字段可以解决metatables的具体问题:
如果
__metatable
在metatable中设置字段,getmetatable
将返回此字段的值,而setmetatable
将引发错误.- Roberto Ierusalimschy,Lua第1版编程,13.3 - 图书馆定义的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
如果您的黑客能够添加代码,并且您需要允许该代码调用os.exit之类的东西,那么无论如何您都运气不好.
但是,您可以限制其代码可以调用的函数.这取决于您仍然希望用户代码能够做什么.查看setfenv的文档和google的"lua sandbox"