6

我正在尝试使用 LuaInterface 2.0.3 在我的 C# 应用程序中嵌入一些 Lua 脚本功能。到目前为止,这工作得很好,但我不知道如何限制对少数指定的 .Net 类的访问。默认情况下,所有 .Net 库都可以通过“luanet”直接访问,Lua 脚本可以自由打开新窗口或访问文件系统。

例如,这个 Lua 脚本将打开一个新窗口:

   Form = luanet.System.Windows.Forms.Form
   mainForm = Form()
   mainForm:ShowDialog()

编写脚本的自由度非常好,但这可能会干扰托管应用程序,并且有一些我不太喜欢的与安全相关的影响。有什么办法可以禁用它吗?

4

2 回答 2

9
--make a table for all the classes you want to expose
safeClasses = {}
--store all the ones you want
safeClasses.Form = luanet.System.Windows.Forms.Form
--etc...

--remove access to LuaInterface
luanet = nil
package.loaded.luanet = nil
--prevent future packages from being loaded
require = nil
package.loadlib = nil

您也可以反过来执行此操作,首先删除 LuaInterface 的全局和存储实例,然后通过本地引用完成所有工作(其余部分中的所有代码都可以使用):

--get a local reference to LuaInterface without clobbering the name
local luainterface = luanet

--delete the global reference to it
luanet = nil

--also delete it from the package store and disable package loading
package.loaded.luanet = nil
require = nil
package.loadlib = nil

--put luanet back locally at its original name (for convenience)
local luanet = luainterface 

--make a table for all the classes you want to expose
safeClasses = {}
--store all the ones you want
safeClasses.Form = luanet.System.Windows.Forms.Form
--etc...

local luainterface=luanet; luanet=nil; local luanet=luainterface(您可以通过直接本地化到luanet然后通过_G对全局表的引用删除全局来避免上面()的三步名称保留舞蹈:

local luanet=_G.luanet
_G.luanet = nil

我只是出于个人喜好选择不这样做。)

于 2011-05-30T01:57:11.020 回答
0

我不太确定你会怎么做,但第一步应该是把它托管在一个额外的AppDomain中。有了这个额外的应用程序域,您可以精细控制哪些模块可以使用,哪些模块不能使用,但是,它将增加额外的工作来在主程序和脚本之间移动数据。

AssemblyLoad/AssemblyResolve事件应该是您的第一站。

于 2011-05-30T00:47:42.497 回答