为lua构建沙盒环境
2012-09-10 15:31
211 查看
我们有时需要限制lua代码的运行环境,或者是让使用者不能访问到lua的一些全局函数.lua语言本身没有类似于C++, C#, Java那样的成员访问控制. 但lua提供了setfenv函数可以很灵活的处理各类权限问题
废话不多说, 看代码
54行执行结果是
54行由于没有注册这个全局函数, 因此无法访问
Response= [string "ProtectedFunction()"]:1: attempt to call global 'ProtectedFunction' (a nil value)
58行在全局环境中加上了这个函数,因此在60行访问正常
protected func
Response= nil
废话不多说, 看代码
1: -- 创建沙盒
2: function SpawnSandBox( )
3:
4: local SandBoxGlobals = {}
5:
6: -- 基础函数添加
7: SandBoxGlobals.print = print
8: SandBoxGlobals.table = table
9: SandBoxGlobals.string = string
10: SandBoxGlobals.math = math
11: SandBoxGlobals.assert = assert
12: SandBoxGlobals.getmetatable = getmetatable
13: SandBoxGlobals.ipairs = ipairs
14: SandBoxGlobals.pairs = pairs
15: SandBoxGlobals.pcall = pcall
16: SandBoxGlobals.setmetatable = setmetatable
17: SandBoxGlobals.tostring = tostring
18: SandBoxGlobals.tonumber = tonumber
19: SandBoxGlobals.type = type
20: SandBoxGlobals.unpack = unpack
21: SandBoxGlobals.collectgarbage = collectgarbage
22: SandBoxGlobals._G = SandBoxGlobals
23:
24: return SandBoxGlobals
25: end
26:
27: -- 在沙盒内执行脚本, 出错时返回错误, nil表示正确
28: function ExecuteInSandBox( SandBox, Script )
29:
30: local ScriptFunc, CompileError = loadstring( Script )
31:
32: if CompileError then
33: return CompileError
34: end
35:
36: setfenv( ScriptFunc, SandBox )
37:
38: local Result, RuntimeError = pcall( ScriptFunc )
39: if RuntimeError then
40: return RuntimeError
41: end
42:
43: return nil
44: end
45:
46: function ProtectedFunction( )
47: print("protected func")
48: end
49:
50:
51: local SandBox = SpawnSandBox( )
52:
53:
54: print ( "Response=", ExecuteInSandBox( SandBox, "table.foreach( _G, print )" ) )
55:
56: print ( "Response=", ExecuteInSandBox( SandBox, "ProtectedFunction()" ) )
57:
58: SandBox.ProtectedFunction = ProtectedFunction
59:
60: print ( "Response=", ExecuteInSandBox( SandBox, "ProtectedFunction()" ) )
54行执行结果是
1: _G table: 00421258
2: string table: 00421050
3: pairs function: 00567F58
4: collectgarbage function: 005675F0
5: unpack function: 004217E8
6: assert function: 005675B0
7: print function: 00567830
8: ipairs function: 00567F28
9: type function: 004217A8
10: tonumber function: 00421768
11: tostring function: 00421788
12: table table: 00420DA8
13: math table: 004210C8
14: setmetatable function: 00421748
15: getmetatable function: 00567710
16: pcall function: 005677F0
17: Response= nil
54行由于没有注册这个全局函数, 因此无法访问
Response= [string "ProtectedFunction()"]:1: attempt to call global 'ProtectedFunction' (a nil value)
58行在全局环境中加上了这个函数,因此在60行访问正常
protected func
Response= nil
相关文章推荐
- 构建 Lua、LuaBind 的 C++ 编译环境
- 使用Nginx+Lua+Redis构建灰度发布环境
- 几种语言原生开发环境构建之--Lua语言
- Python2.7.12开发环境构建(自动补全)
- 【Dockerfile】CentOS6.x中Docker通过Dockerfile构建常用的基础环境 # 设置基本的镜像,后续命令都以这个镜像为基础 FROM centos # 作者信息 MAI
- 使用Maven构建项目环境,利用Jsoup实现数据抓取(上)
- Windows平台下LUA环境的搭建
- Maven私服Nexus3.x环境构建操作记录
- Grunt自动化构建环境搭建
- 一步一步构建手机WebApp开发——环境搭建篇
- lua学前必备【帮助你快速搭建编写环境】
- quick-cocos2d-x开发环境Lua for IntelliJ IDEA的安装
- 【LuaWithC++】基本概念&环境配置
- 配置EditPlus与NAnt构建轻型的.NET开发环境
- 用Maven构建Java Web开发环境…
- [转]在.NET环境中实现每日构建(Daily Build)--ccnet,MSBuild篇
- 在eclipse LDT(Koneki)中搭建quick-cocos2d-x的lua开发环境
- win8下用Maven构建hadoop环境编写MapReduce程序
- 微软虚拟化技术-构建高效开发与测试环境(三)
- 手游开发神器cocos2d-x editor for lua 之配置lua环境和运行hellolua