2010-12-29 11 views
8

Ich bin Lua (5.1) in einer C/C++ - Anwendung einbetten.LuaL_openlibs() und Sandbox-Skripts

Ich verwende die LuaL_openlibs() Funktion, um die Basis-Bibliotheken zu laden. Diese Funktion lädt jedoch einige andere Bibliotheken, die ich deaktivieren möchte, damit sie für meine Lua-Skripte nicht verfügbar sind.

Insbesondere möchte ich die IO-und OS-Module deaktivieren. Gibt es eine Funktion, die ich aufrufen kann, um diese Module programmatisch zu deaktivieren (oder zu entladen), damit ich eine sichere Sandbox-Umgebung für die Ausführung von Lua-Skripten erstellen kann?

Antwort

8

Ich weiß nicht, wie Module zu deaktivieren, aber man kann immer noch welche davon wählen zu laden, anstatt sie alle mit luaL_openlibs des Ladens. Section 7.3 of the Lua 5.1 manual sagt:

Die luaopen_* Funktionen (Bibliotheken öffnen) kann nicht direkt aufgerufen werden, wie eine normale C-Funktion. Sie müssen durch Lua aufgerufen werden, wie eine Lua-Funktion.

Das heißt, anstatt direkt die Funktion wie in Lua Aufruf 5.0:

luaopen_table(L); 

... Sie schieben Sie es als eine C-Funktion mit dem Namen und verwenden lua_call oder ähnlich in Lua 5.1:

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

Die Funktionen, die Sie dies in lualib.h mit aufgelistet tun können:

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

Ich sollte beachten, dass dies für Lua 5.1 ist, und während es mit Lua 5.2 funktionieren könnte, ist es nicht der empfohlene Weg mehr. Die beste Sache ist, in der linit.c Akte der lua Verteilung zu schauen und zu sehen, wie sie es tun – Aktau

0

In früheren Versionen von Lua konnten Sie angeben, welche Bibliotheken Sie laden wollten. Insbesondere in meine Kopie von lualib.h sehe ich die folgenden Funktionen erklärt:

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

Ich könnte nicht sagen, die Folgen nicht alle Bibliotheken geladen, da ich luaL_openlibs() in meinem Code nennen. Die erste Edition der Programmierung in Lua ist online verfügbar und erwähnt, dass luaL_openlibs() die luaopen _ *() Funktionsaufrufe ersetzen sollte. Die älteren Funktionen können jedoch aus Gründen der Abwärtskompatibilität weiterhin enthalten sein. http://www.lua.org/pil/24.1.html

HTH

12

luaL_openlibs iteriert nur durch eine Liste von Bibliotheksladeprogrammen, die in der gleichen Datei deklariert sind. Löschen/kommentieren Sie einfach die Zeilen luaopen_io und luaopen_os. Erledigt.

Wenn Sie schädliche sind die Lua Quelle zu bearbeiten, dann können Sie Ihre eigene Funktion definieren, die diese beiden Bibliotheken auslässt:

#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

danke für die Antwort (ich bin für die Wahl verwöhnt). Ich hätte für diese Antwort +1 gewählt (leider kann ich nicht wählen!). Ich musste Tungs Antwort wählen, weil er zuerst mit ähnlichen Informationen antwortete. Aber ich schätze beide Antworten – skyeagle

9

Die einfachste Lösung von allen: nur tun io=nil;os=nil nach den Bibliotheken geladen .