2011-05-30 26 views
6

Intento incrustar algunas funciones de guiones Lua en mi aplicación C# utilizando LuaInterface 2.0.3. Esto funciona bien hasta el momento, pero no puedo encontrar la manera de restringir el acceso a solo algunas clases .Net especificadas. Por defecto, todas las bibliotecas .Net son accesibles directamente a través de "luanet" y los scripts de Lua son libres de abrir ventanas nuevas o acceder al sistema de archivos.LuaInterface - cómo restringir el acceso a las clases .Net?

p. Ej. este script Lua se abrirá una nueva ventana:

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

Libertad de secuencias de comandos es grande y todo, pero esto es probable que interfiera con la aplicación de alojamiento y tiene algunas implicaciones relacionadas con la seguridad que no soy demasiado aficionado. ¿Hay alguna forma de desactivar esto?

+0

Es posible que esto obtenga una mejor respuesta en Games Development, http://gamedev.stackexchange.com/. Es algo que los desarrolladores de juegos tienen más probabilidades de haber hecho en el pasado, y parece que se trata de desarrollo de juegos de todos modos. – Glenn

+1

Una pregunta menos específica sobre sandboxing Lua, que puede apuntarle en la dirección correcta, está aquí: http://stackoverflow.com/questions/1224708/how-can-i-create-a-secure-lua-sandbox – BMitch

Respuesta

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 

También podría hacerlo a la inversa, la eliminación de los casos mundiales y almacenados de LuaInterface primero y luego hacer todo el trabajo a través de una referencia local (que todo el código en el resto de la block puede utilizar):

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

(puede evitar el paso de tres nombre de conservación de baile anterior (local luainterface=luanet; luanet=nil; local luanet=luainterface) mediante la localización directamente a luanet y luego borrar el global a través de la referencia a la tabla _G mundial:

local luanet=_G.luanet 
_G.luanet = nil 

Simplemente elegí no como una cuestión de preferencia personal.)

+0

Solo lo he visto rápido, pero parece excelente. Supongo que mi error fue suponer que esto tiene que hacerse en C# de alguna manera configurando o configurando el intérprete de Lua de manera diferente - no me di cuenta de que el sandboxing se podía hacer directamente en Lua. – Mario

+0

Lo probé en mi aplicación; esto es ** exactamente ** lo que estaba buscando. En combinación con este artículo [link] (http://lua-users.org/wiki/SandBoxes), ahora debería ser capaz de construir un sandbox apropiado para mis scripts de Lua. ¡Gracias! :) – Mario

0

No estoy seguro de cómo exactamente lo harías, pero el primer paso debería ser alojarlo en un extra AppDomain. Con ese dominio adicional, tiene un control granular de los módulos que pueden usarse y los que no, sin embargo, agregará trabajo adicional para mover los datos entre su programa principal y el script.

Los eventos AssemblyLoad/AssemblyResolve deben ser su primera parada.

+0

I No creo que esto sea lo suficientemente eficiente exactamente debido a ese "trabajo extra". Se supone que Lua dirige la lógica del juego, como AI o los scripts de misión ... no estoy seguro de si la comunicación entre dominios de aplicaciones estaría disponible para esa tarea, pero tengo poca experiencia con eso, así que ... sí. :/ – Mario

Cuestiones relacionadas