2010-12-29 11 views
8

Estoy incrustando Lua (5.1) en una aplicación C/C++.LuaL_openlibs() y scripts de sandboxing

Estoy utilizando la función LuaL_openlibs() para cargar las librerías base. Sin embargo, esta función carga algunas otras bibliotecas que quiero deshabilitar para que no estén disponibles para mis scripts de Lua.

Específicamente, deseo desactivar los módulos IO y OS. ¿Hay alguna función a la que pueda llamar para programar y desactivar (o descargar) estos módulos de modo que pueda crear un entorno de entorno seguro para ejecutar scripts Lua?

Respuesta

8

No sé cómo desactivar los módulos, pero todavía se puede elegir cuáles de carga en lugar de cargar a todos con luaL_openlibs. Section 7.3 of the Lua 5.1 manual dice:

Los luaopen_* funciones (para abrir bibliotecas) no puede ser llamado directamente, como una función regular C. Deben ser llamados a través de Lua, como una función Lua.

Es decir, en lugar de llamar directamente a la función que en Lua 5.0:

luaopen_table(L); 

... que lo empuje en función C con su nombre y el uso lua_call o similar en Lua 5.1:

lua_pushcfunction(L, luaopen_table); 
lua_pushliteral(L, LUA_TABLIBNAME); 
lua_call(L, 1, 0); 

Las funciones que puede hacer esto con se enumeran en lualib.h:

Function  | Name 
----------------+----------------- 
luaopen_base | "" 
luaopen_table | LUA_TABLIBNAME 
luaopen_io  | LUA_IOLIBNAME 
luaopen_os  | LUA_OSLIBNAME 
luaopen_string | LUA_STRLIBNAME 
luaopen_math | LUA_MATHLIBNAME 
luaopen_debug | LUA_DBLIBNAME 
luaopen_package | LUA_LOADLIBNAME 
+0

Debo señalar que esto es para lua 5.1, y si bien podría funcionar con lua 5.2, ya no es la manera recomendada. Lo mejor es buscar en el archivo linit.c de la distribución de lua y ver cómo lo hacen – Aktau

0

En versiones anteriores de Lua solía poder especificar qué bibliotecas deseaba cargar. En concreto, en mi copia de lualib.h veo las siguientes funciones declaradas:

LUALIB_API int (luaopen_base) (lua_State *L); 
LUALIB_API int (luaopen_table) (lua_State *L); 
LUALIB_API int (luaopen_io) (lua_State *L); 
LUALIB_API int (luaopen_os) (lua_State *L); 
LUALIB_API int (luaopen_string) (lua_State *L); 
LUALIB_API int (luaopen_math) (lua_State *L); 
LUALIB_API int (luaopen_debug) (lua_State *L); 
LUALIB_API int (luaopen_package) (lua_State *L); 
LUALIB_API void (luaL_openlibs) (lua_State *L); 

no se notaba las consecuencias de no cargar todas las bibliotecas, ya que llamo luaL_openlibs() en mi código. La Primera Edición de Programación en Lua está disponible en línea, y menciona que luaL_openlibs() debería reemplazar las llamadas a la función luaopen _ *(). Sin embargo, las funciones anteriores aún pueden incluirse para compatibilidad con versiones anteriores. http://www.lua.org/pil/24.1.html

HTH

12

luaL_openlibs simplemente itera a través de una lista de cargadores de bibliotecas, declarados en el mismo archivo. Simplemente elimine/comente las líneas luaopen_io y luaopen_os. Hecho.

Si usted es adversa a la edición de la fuente de Lua, a continuación, puede definir su propia función que deja fuera las dos bibliotecas:

#define LUA_LIB 

#include "lua.h" 
#include "lualib.h" 
#include "lauxlib.h" 

static const luaL_Reg lualibs[] = { 
    {"", luaopen_base}, 
    {LUA_LOADLIBNAME, luaopen_package}, 
    {LUA_TABLIBNAME, luaopen_table}, 
    {LUA_STRLIBNAME, luaopen_string}, 
    {LUA_MATHLIBNAME, luaopen_math}, 
    {LUA_DBLIBNAME, luaopen_debug}, 
    {NULL, NULL} 
}; 

LUALIB_API void my_openlibs (lua_State *L) { 
    const luaL_Reg *lib = lualibs; 
    for (; lib->func; lib++) { 
    lua_pushcfunction(L, lib->func); 
    lua_pushstring(L, lib->name); 
    lua_call(L, 1, 0); 
    } 
} 
+0

gracias por la respuesta (no tengo opciones). Hubiera votado +1 por esta respuesta (lamentablemente, no puedo votar!). Tuve que elegir la respuesta de Tung porque respondió primero con información similar. Pero aprecio ambas respuestas – skyeagle

9

La solución más simple de todos ellos: Eso sí, io=nil;os=nil después de cargar las bibliotecas .

Cuestiones relacionadas