lua中沙盒函數的定義-closure的使用

將老版本的函數保存在一個私有的變量中,只用新版本的函數才能訪問它,這樣的技術建立一個安全的運行環境,即所謂的「沙盒(sandbox)」。當執行一些未受信任的代碼時就須要一個安全的運行環境,例如在服務器中執行那些從internet上接收的代碼。下面是個例子:若是要限制一個程序訪問文件的話,只須要使用closure(閉合函數)來重定義函數的io.open:安全

<!-- lang: lua -->
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

其中:服務器

<!-- lang: lua -->
function(filename,mode)

這個操做是給函數從新定義它的參數:通過從新定義後,一個程序就只能經過新的受限制的版原本調用原來那個未受限制的open函數。示例將原來的不安全的版本保存到closure的一個私有的變量中,從而使得外部再也沒法訪問原來的版本。經過這種技術,能夠在lua的語言層面上就構建一個安全的運行環境,並且不失簡單性、靈活性。函數

再來看一個例子:從新定義sin函數,使其參數可以使用角度來替代弧度,那麼這個新參數必須轉換它的實參,並調用原來的sin函數來完成真正的運算。lua

<!-- lang: lua -->
do
local oldSin = math.sin
    local k = math.pi/180
    math.sin = function(x)
        return oldSin(x*k)
    end
end

相對提供一套大而全的解決方案,Lua提供的則是一套"元機制(meta-mechanism)",所以才能夠根據特定的安全須要來建立一個安全運行的環境。code

相關文章
相關標籤/搜索