Je veux exécuter un fichier .lua non approuvé dans son propre environnement en appelant lua_setfenv () a> afin qu'il ne puisse affecter aucun de mon code. La documentation de cette fonction, mais seulement explique comment appeler une fonction, pas comment exécuter un fichier. p> actuellement pour exécuter le fichier que j'utilise : p> Dois-je appeler la fonction "DOFILE" LUA de l'API C avec lua_setfenv code> ou existe-t-il un moyen plus élégant de faire il? p> p>
3 Réponses :
lual_loadfile () code> chargera le morceau, puis appelez
lua_setfenv () code> pour définir la table d'environnement, appelez
lua_pcall () code> pour exécuter le morceau. Voir la récente réponse donnée par le juge Maygarden à Appel de la Lua Fonctions de .Lua's Utiliser des poignées? p>
Voir la discussion au wiki de l'utilisateur Lua de Sandboxing et le sujet plus général de < Un href = "http://lua-users.org/wiki/scriptsecurity" rel = "noreferrer"> Security Security . Il y a un certain nombre de problèmes subtils et pas si subtils avec ce genre de chose. Cela peut être fait, mais la protection contre le code tel que La technique générale consiste à créer un environnement de fonction pour le bac à sable qui a une blancheur de fonctions autorisées. Dans certains cas, cette liste peut même être vide, mais laisser l'utilisateur avoir accès à Vous utilisez ensuite Une autre note est que les fonctions de chargement chargeront généralement des bytecodes précompilés ou du texte LUA. Il s'avère beaucoup plus sûr si vous n'autorisez jamais de bytecode précompilé, car un certain nombre de façons de rendre la mauvaise conduite de VM ont été identifiées que toutes dépendent de la fabrique de fabrique de la traçabilité. Étant donné que les fichiers Bytecode commencent par une séquence d'octets bien définie qui n'est pas un texte de texte ASCII clair, tout ce que vous avez à faire est de lire le script dans un tampon à chaîne, de tester pour l'absence du marqueur et ne le transmet que sur Il y a eu une discussion juste à la Liste de mailing Lua-L sur Les années de ce genre de chose, alors la recherche de la recherche est également susceptible d'être utile. p> pour i = 1 14e39 do end finalement code> nécessite plus que de simplement limiter quelles fonctions sont disponibles sur un bac à sable. P>
paires () code>, par exemple, est presque certainement inoffensif. La page Sandbox a une liste des fonctions système décomposées par leur sécurité comme une référence pratique pour la construction d'un tel blancheur. P>
lua_setfenv () code> pour appliquer l'environnement de fonction au script de l'utilisateur que vous avez chargé (mais pas encore exécuté) avec
lua_loadfile () code> ou
ou
Lua_Loadstring () code> selon le cas. Avec l'environnement joint, vous pouvez l'exécuter avec
lua_pcall () code> et amis. Avant l'exécution, certaines personnes ont effectivement numérisé le bytecode chargé pour les opérations qu'ils ne veulent pas permettre. Qui peut être utilisé pour interdire absolument des boucles ou écrire aux variables globales. P>
lua_loadstring ( ) code> s'il n'est pas bytecode. p>
Merci; Je me suis déjà occupé de boucles infinies en définissant un crochet de débogage qui met fin au script après 10 millions d'instructions. En ce qui concerne les fonctions, le fichier fourni par l'utilisateur ne contient que des variables globales et aucune fonction que ce soit, donc je n'ai pas besoin de la fonction blanche.
Au fait, c'est ce que j'ai fini par faire:
static void Pop(int elements = 1) { lua_pop(mState, elements); } /* Sets a maximum number of instructions before throwing an error */ static void SetMaximumInstructions(int count) { lua_sethook(mState, &Lua::MaximumInstructionsReached, LUA_MASKCOUNT, count); } static void ClearMaximumInstructions() { lua_sethook(mState, &Lua::MaximumInstructionsReached, 0, 0); } static void MaximumInstructionsReached(lua_State *, lua_Debug *) { Error("The maximum number of instructions has been reached"); } static int GetStackSize() { return lua_gettop(mState); }