LuaL_openlibs () und Sandbox-Skripts

8

Ich habe Lua (5.1) in eine C / C ++ - Anwendung eingebettet.

Ich verwende die Funktion LuaL_openlibs() , um die Basisbibliotheken 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?

    
skyeagle 29.12.2010, 02:41
quelle

4 Antworten

8

Ich weiß nicht, wie man Module deaktiviert, aber Sie können immer noch auswählen, welche geladen werden sollen, anstatt sie alle mit luaL_openlibs zu laden. Abschnitt 7.3 des Lua 5.1-Handbuchs lautet:

  

Die Funktionen luaopen_* (zum Öffnen von Bibliotheken) können nicht direkt aufgerufen werden, wie eine reguläre C-Funktion. Sie müssen durch Lua aufgerufen werden, wie eine Lua-Funktion.

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

%Vor%

... Sie drücken es als C-Funktion mit seinem Namen und verwenden lua_call oder ähnliches in Lua 5.1:

%Vor%

Die Funktionen, mit denen Sie dies tun können, sind in lualib.h :

aufgelistet %Vor%     
Tung Nguyen 29.12.2010, 07:02
quelle
12

luaL_openlibs durchsucht nur eine Liste von Bibliotheksladern, die in derselben Datei deklariert sind. Löschen / kommentieren Sie einfach die Zeilen luaopen_io und luaopen_os . Fertig.

Wenn Sie die Lua-Quelle nicht bearbeiten möchten, können Sie eine eigene Funktion definieren, die diese beiden Bibliotheken auslässt:

%Vor%     
Mud 29.12.2010 08:21
quelle
9

Die einfachste Lösung von allen: mach einfach io=nil;os=nil nach dem Laden der Bibliotheken.

    
jpjacobs 29.12.2010 09:37
quelle
0

In älteren Versionen von Lua war es möglich, die Bibliotheken anzugeben, die Sie laden wollten. Insbesondere in meiner Kopie von lualib.h sehe ich die folgenden erklärten Funktionen:

%Vor%

Ich konnte Ihnen nicht die Konsequenzen sagen, wenn ich nicht alle Bibliotheken lade, da ich luaL_openlibs () in meinem Code anrufe. 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. Ссылка

HTH

    
walkingTarget 29.12.2010 04:58
quelle

Tags und Links