博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua中沙盒函数的定义-closure的使用
阅读量:6581 次
发布时间:2019-06-24

本文共 916 字,大约阅读时间需要 3 分钟。

hot3.png

将老版本的函数保存在一个私有的变量中,只用新版本的函数才能访问它,这样的技术创建一个安全的运行环境,即所谓的“沙盒(sandbox)”。当执行一些未受信任的代码时就需要一个安全的运行环境,例如在服务器中执行那些从internet上接收的代码。下面是个例子:如果要限制一个程序访问文件的话,只需要使用closure(闭合函数)来重定义函数的io.open:

dolocal oldOpen = io.open local access_OK = function(filename, mode)
<检查各种权限,判断是否合法>
end io.open = function(filename,mode) if access_OK(filename, mode) then return oldOpen(filename, mode) else return nil, "access denied" end endend

其中:

function(filename,mode)

这个操作是给函数重新定义它的参数:经过重新定义后,一个程序就只能通过新的受限制的版本来调用原来那个未受限制的open函数。示例将原来的不安全的版本保存到closure的一个私有的变量中,从而使得外部再也无法访问原来的版本。通过这种技术,可以在lua的语言层面上就构建一个安全的运行环境,而且不失简单性、灵活性。

再来看一个例子:重新定义sin函数,使其参数能够使用角度来替代弧度,那么这个新参数必须转换它的实参,并调用原来的sin函数来完成真正的运算。

dolocal oldSin = math.sin local k = math.pi/180 math.sin = function(x) return oldSin(x*k) endend

相对提供一套大而全的解决方案,Lua提供的则是一套"元机制(meta-mechanism)",因此才可以根据特定的安全需要来创建一个安全运行的环境。

转载于:https://my.oschina.net/ittomato/blog/123335

你可能感兴趣的文章
下载稻草人下来刷新+gallery
查看>>
删除浏览器浏览器删除cookie方法
查看>>
微软URLRewriter.dll的url重写的简单使用(实现伪静态)
查看>>
leetcode -- Combination Sum II
查看>>
1z0-052 q209_7
查看>>
PIN码计算锦集
查看>>
[Unity3D]再次点击以退出程序
查看>>
架构师的97种习惯
查看>>
PHP 开发 APP 接口 学习笔记与总结 - XML 方式封装通信接口
查看>>
IT基础架构规划方案之实际网络设计案例
查看>>
Navicat for MySQL 使用SSH方式链接远程数据库(二)
查看>>
poj 1274The Perfect Stall
查看>>
ibm BIP2276E: The flow includes a message flow of node type 'ComIbmFileReadNode'
查看>>
HDU 4720 Naive and Silly Muggles (外切圆心)
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
Ubuntu上运行Blender,在控制台上查看运行结果
查看>>
怎么检查网站的死链接呢?
查看>>
scrapy爬虫框架实例一,爬取自己博客
查看>>
React是UI的未来吗?
查看>>
中国人社部:2018年15个省(区、市)调整最低工资标准
查看>>