2010-12-29 9 views
8

Sto incorporando Lua (5.1) in un'applicazione C/C++.LuaL_openlibs() e script sandboxing

Sto utilizzando la funzione LuaL_openlibs() per caricare le librerie di base. Tuttavia, questa funzione carica alcune altre librerie che voglio disabilitare in modo che non siano disponibili per i miei script Lua.

In particolare, voglio disabilitare i moduli IO e OS. C'è una funzione che posso chiamare per disabilitare (o scaricare) questi moduli in modo programmatico in modo da poter creare un ambiente sandbox sicuro per l'esecuzione degli script Lua?

risposta

8

Non so come disattivare i moduli, ma è ancora possibile scegliere quelli da caricare al posto di tutti loro carico con luaL_openlibs. Section 7.3 of the Lua 5.1 manual dice:

Le luaopen_* funzioni (per aprire le biblioteche), non può essere chiamato direttamente, come una normale funzione C. Devono essere chiamati attraverso Lua, come una funzione Lua.

Cioè, invece di chiamare direttamente la funzione come in Lua 5.0:

luaopen_table(L); 

... si spinge come una funzione C con il suo nome e utilizzare lua_call o simili in Lua 5.1:

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

Le funzioni si può fare questo con sono elencati in 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

Devo notare che questo è per lua 5.1, e mentre potrebbe funzionare con lua 5.2, non è più il modo consigliato. La cosa migliore è cercare nel file linit.c della distribuzione lua e vedere come lo fanno – Aktau

0

Nelle versioni precedenti di Lua eravate in grado di specificare quali librerie si desidera caricare. In particolare, nella mia copia di lualib.h vedo le seguenti funzioni dichiarate:

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

Non si potrebbe dire le conseguenze di non caricare tutte le librerie, dal momento che io chiamo luaL_openlibs() nel mio codice. La prima edizione della programmazione in Lua è disponibile online e afferma che luaL_openlibs() dovrebbe sostituire le chiamate alla funzione luaopen _ *(). Tuttavia, le precedenti funzionalità possono ancora essere incluse per la compatibilità all'indietro. http://www.lua.org/pil/24.1.html

HTH

12

luaL_openlibs esegue semplicemente una lista di caricatori di libreria, dichiarati nello stesso file. Basta cancellare/commentare le linee luaopen_io e luaopen_os. Fatto.

Se siete avversi a modificare il sorgente Lua, allora si può definire la propria funzione che lascia fuori quei due librerie:

#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

grazie per la risposta (ho solo l'imbarazzo della scelta). Avrei votato +1 per questa risposta (sfortunatamente, non posso votare!). Ho dovuto scegliere la risposta di Tung perché ha risposto prima con informazioni simili. Ma apprezzo entrambe le risposte – skyeagle

9

La soluzione più semplice di tutti: basta fare io=nil;os=nil dopo il caricamento delle librerie .

Problemi correlati