lua中沙盒函数的定义-closure的使用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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


do
local 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
    end
end

其中:


function(filename,mode)

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

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


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

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

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

你可能感兴趣的:(lua中沙盒函数的定义-closure的使用)