LuaInterface - как ограничить доступ к .Net классам? - PullRequest
6 голосов
/ 30 мая 2011

Я пытаюсь встроить некоторые функции сценариев Lua в свое приложение C # с помощью LuaInterface 2.0.3. Пока это работает нормально, но я не могу понять, как ограничить доступ только к нескольким указанным классам .Net. По умолчанию все библиотеки .Net доступны напрямую через "luanet", и сценарии Lua могут свободно открывать новые окна или обращаться к файловой системе.

например. этот скрипт Lua откроет новое окно:

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

Свобода написания сценариев великолепна и все такое, но это может помешать хостингу и иметь некоторые последствия, связанные с безопасностью, которые мне не очень нравятся. Есть ли способ отключить это?

Ответы [ 2 ]

9 голосов
/ 30 мая 2011
--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, а затем выполнив всю работу через локальную ссылку (которую может выполнить весь код в остальном блоке ).use):

--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

Я просто выбрал не из-за личных предпочтений.)

0 голосов
/ 30 мая 2011

Я не совсем уверен, как именно вы это сделаете, но первым шагом должно быть размещение его в дополнительном AppDomain . С этим дополнительным доменом приложения вы можете детально контролировать, какие модули можно использовать, а какие нет, однако это добавит дополнительную работу для перемещения данных между вашей основной программой и сценарием.

События AssemblyLoad / AssemblyResolve должны быть вашей первой остановкой.

...