簡體   English   中英

從文件獲取變量

[英]Getting variables from a file

假設我有一個“ test.lua”文件,如下所示:

myVar = 5

Food = function()

end

如果我通過loadfile或Lua API(使用C ++或其他語言)加載文件並運行它,則變量將保存在全局命名空間_G下; 但是,我想單獨使用它們,例如_test.myVar和_G.myVar。 (這樣做的原因是我只想擁有該文件中的變量列表)。 謝謝。

運行腳本之前,請使用lua_setfenv

module('_test')

myVar = 5

Food = function()

end

然后,從其他文件中:

require 'test.lua' --> or loadfile('test.lua')()

print(myVar) --> nil
print(Food) --> nil
print(_test.myVar) --> 5
print(_test.Food) --> function

lhf說了什么。

對於可能來自完全不受信任的來源的文件,要獲得更多的健壯性,您應該在Wiki上閱讀有關沙箱的信息。

關鍵思想是要小心哪些全局函數和變量可用於在數據文件的上下文中執行代碼。 獲得大量控制權的一種簡單方法是構造為腳本提供全局變量的環境表,使其僅包含安全功能白名單。 為此,可以構造一個合適的表,然后在調用它之前將其設置為新編譯腳本的環境。 來自C API的lua_setfenv()或來自Lua端的setfenv都可以在成功調用luaL_loadfile()loadfile或其loadfile或Lua中的親戚之一返回的對象上使用。 加載腳本並分配環境后,您可以使用lua_pcall()pcall運行它。

不要忘記檢查所有內容是否有錯誤。

腳本完成后,已在其環境表(而不是_G寫入或更新了它創建的變量。

自然,該環境表可以使用一個元表來使您提供腳本的某些全局變量也有效地只讀。

為了進行額外的控制,有些人將其構想進一步擴展並安排為限制腳本運行所允許的虛擬指令周期數或實際時鍾時間。 甚至可以在加載某些操作碼后檢查字節碼。 在許多情況下,這可以用來防止甚至嘗試執行包含循環的腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM