当前位置:  开发笔记 > 编程语言 > 正文

无论如何都要避免Lua中的这个安全问题?

如何解决《无论如何都要避免Lua中的这个安全问题?》经验,为你挑选了2个好方法。

我正在研究一个可本地化的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)

有任何想法吗?



1> Alexander Gl..:

首先,最重要的是在沙盒环境中执行不受信任的代码 - 正如其他海报所说的那样.除了加载字节码块之外,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



2> The Archetyp..:

如果您的黑客能够添加代码,并且您需要允许该代码调用os.exit之类的东西,那么无论如何您都运气不好.

但是,您可以限制其代码可以调用的函数.这取决于您仍然希望用户代码能够做什么.查看setfenv的文档和google的"lua sandbox"

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有