2010-12-29 3 views
8

J'encadre Lua (5.1) dans une application C/C++. J'utilise la fonction LuaL_openlibs() pour charger les bibliothèques de base. Cependant, cette fonction charge d'autres bibliothèques que je veux désactiver pour qu'elles ne soient pas disponibles pour mes scripts Lua. En particulier, je souhaite désactiver les modules d'E/S et d'OS. Y a-t-il une fonction que je peux appeler pour désactiver (ou décharger) par programmation ces modules afin de pouvoir créer un environnement de bac à sable sécurisé pour exécuter des scripts Lua?LuaL_openlibs() et les scripts sandboxing

Répondre

8

Je ne sais pas comment désactiver les modules, mais vous pouvez toujours choisir ceux à charger au lieu de les charger tous avec luaL_openlibs. Section 7.3 of the Lua 5.1 manual dit:

Les luaopen_* fonctions (pour ouvrir les bibliothèques) ne peut pas être appelé directement, comme une fonction régulière C. Ils doivent être appelés à travers Lua, comme une fonction Lua.

C'est, au lieu d'appeler directement la fonction comme dans Lua 5.0:

luaopen_table(L); 

... vous poussez en fonction C avec son nom et utiliser lua_call ou similaire Lua 5.1:

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

Les fonctions que vous pouvez le faire avec sont énumérés dans 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

Je devrais noter que ceci est pour lua 5.1, et bien qu'il puisse fonctionner avec lua 5.2, ce n'est plus la manière recommandée. La meilleure chose est de regarder dans le fichier linit.c de la distribution lua et de voir comment ils le font – Aktau

0

Dans les anciennes versions de Lua, vous pouviez spécifier les bibliothèques que vous vouliez charger. Plus précisément, dans ma copie de lualib.h je vois les fonctions suivantes ont déclaré:

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

je ne pouvais pas vous dire les conséquences de ne pas charger toutes les bibliothèques, depuis que j'appelle luaL_openlibs() dans mon code. La première édition de la programmation dans Lua est disponible en ligne, et mentionne que luaL_openlibs() devrait remplacer les appels de la fonction luaopen _ *(). Cependant, les anciennes fonctions peuvent toujours être incluses pour une compatibilité ascendante. http://www.lua.org/pil/24.1.html

HTH

12

luaL_openlibs juste itére à travers une liste de chargeurs de bibliothèque, déclarés dans le même fichier. Il suffit de supprimer/commenter les lignes luaopen_io et luaopen_os. Terminé.

Si vous êtes défavorable à l'édition la source Lua, vous pouvez définir votre propre fonction qui laisse de ces deux bibliothèques:

#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

merci pour la réponse (j'ai l'embarras du choix). Aurait voté +1 pour cette réponse (malheureusement, je ne peux pas voter!). J'ai dû choisir la réponse de Tung parce qu'il a répondu d'abord avec des informations similaires. Mais j'apprécie les deux réponses – skyeagle

9

La solution la plus simple de tous: fais juste io=nil;os=nil après le chargement des bibliothèques .