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
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
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
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);
}
}
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
La solution la plus simple de tous: fais juste io=nil;os=nil
après le chargement des bibliothèques .
- 1. C#: Sandboxing et performance (MarshalByRefObject)
- 2. Mac OS Lion et Sandboxing
- 3. Sandboxing Javascript
- 4. sandboxing désactiver de Google App Engine serveur dev comme un remplacement pour les scripts bash/tissu
- 5. Différence entre les scripts et les scripts
- 6. Sortie JavaScript de Sandboxing?
- 7. Sandboxing Requêtes DQL dans Doctrine2
- 8. Meilleures pratiques du site Sandboxing?
- 9. haproxy et les scripts arriviste
- 10. Loader pour les scripts et les images
- 11. jQuery.html() supprime les scripts et les styles
- 12. Plugins de sandboxing avec framework d'extensibilité géré
- 13. Sandboxing Google Custom Search Engine Styles
- 14. Vous cherchez un bon framework de sandboxing
- 15. Code PHP des utilisateurs de Sandboxing
- 16. Recommandations pour sandboxing dans PHP5 ou des alternatives?
- 17. Sandboxing Code Java/Groovy/Freemarker - Empêcher l'exécution de méthodes spécifiques
- 18. Comprendre crossdomain.xml et les scripts malveillants?
- 19. C# et les scripts de chaînes dynamiques
- 20. question sur PackageMaker et les scripts
- 21. méthode JQuery .html() et les scripts externes
- 22. backbone.js et les scripts inter-domaines
- 23. onchange combobox et les scripts java
- 24. Scripts Plone et Python
- 25. C# Scripts et sécurité
- 26. Les scripts PHP s'arrêtent
- 27. Sql et scripts php
- 28. Scripts et outils dTrace
- 29. Scripts Nhibernate et sql
- 30. chown dans les scripts
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