LuaInterface - 如何限制访问 .Net 类?

我正在尝试使用LuaInterface 2.0.3在我的C#应用程序中嵌入一些Lua脚本功能。到目前为止,这个工作很顺利,但是我无法弄清楚如何仅限于几个指定的.Net类访问。默认情况下,所有.Net库都可以通过"luanet"直接访问,Lua脚本可以自由地打开新窗口或访问文件系统。

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

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

虽然脚本自由度很高,但这很可能会干扰主机应用程序,并带有一些安全相关的含义,我不太喜欢。有什么办法可以禁用这个功能吗?

原文链接 https://stackoverflow.com/questions/6171381

点赞
stackoverflow用户127059
stackoverflow用户127059

我不确定应该如何具体实现,但第一步应该是将其托管在额外的 AppDomain 中。有了这个额外的 appdomain,您可以对可以使用哪些模块进行细粒度的控制,但需要额外的工作来在主程序和脚本之间移动数据。

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

2011-05-30 00:47:42
stackoverflow用户34799
stackoverflow用户34799
--创建一个表格来存储所有您想要公开的类
safeClasses = {}
--将您想要的所有类存储进去
safeClasses.Form = luanet.System.Windows.Forms.Form
--等等...

--删除对 LuaInterface 的访问权
luanet = nil
package.loaded.luanet = nil
--防止将来装载包
require = nil
package.loadlib = nil

您还可以采用相反的方法,首先删除全局和存储的 LuaInterface 实例,然后通过本地引用执行所有操作(其他 中的所有代码都可以使用):

--获取 LuaInterface 的本地引用,而不会覆盖名称
local luainterface = luanet

--删除对其的全局引用
luanet = nil

--还从包存储中删除它并禁用包装载
package.loaded.luanet = nil
require = nil
package.loadlib = nil

--将原名称的 luanet 放回本地(为方便)
local luanet = luainterface

--创建一个表格来存储所有您想要公开的类
safeClasses = {}
--将您想要的所有类存储进去
safeClasses.Form = luanet.System.Windows.Forms.Form
--等等...

(您可以通过 _G 引用全局表直接将局部化到 luanet,然后通过 _G 引用全局表删除全局引用:local luanet=_G.luanet ; _G.luanet = nil。我只是出于个人偏好选择不这样做。)

2011-05-30 01:57:11