6
votes

Comment puis-je continuer à exécuter de manière sécurisée d'un sous-ensemble de Python?

J'ai besoin de stocker le code source pour une fonction de base dans une base de données et de lui permettre de modifier via une interface administrative. Ce code prendra plusieurs chiffres et chaînes en tant que paramètres et retournera un numéro ou aucun . Je sais que Eval est mal, j'ai donc besoin de mettre en œuvre un moyen sûr d'exécuter un sous-ensemble de Python très basique, ou quelque chose de syntaxiquement similaire au moins, à partir d'une application Web à base de Python.

La réponse évidente consiste toutefois à mettre en œuvre une DSL (langue spécifique du domaine), mais je n'ai aucune expérience avec cela, pas plus que je n'ai aucune idée où commencer, et beaucoup de ressources disponibles semblent aller un peu sur mon diriger. J'espère que peut-être qu'il y a déjà quelque chose qui me permettra de générer essentiellement une fonction sécurisée de Python-appelable à partir d'une chaîne dans une base de données. La langue n'a vraiment besoin que de soutenir l'affectation, les mathématiques de base, si / e) et des comparaisons de chaînes insensibles. Toute autre caractéristiques est un bonus, mais je pense que la plupart des choses peuvent être faites avec seulement cela, pas besoin de structures de données complexes, de classes, de fonctions, etc.

Si rien de tel n'existe actuellement, je suis prêt à examiner la possibilité de la créer une, mais comme je l'ai dit, je n'ai aucune idée de la façon de faire cela, et des conseils à cet égard seraient également appréciés.


0 commentaires

4 Réponses :


2
votes

Les environnements Python restreints sont difficiles à faire vraiment en sécurité.

Peut-être quelque chose comme Lua est un meilleur ajustement pour vous


1 commentaires

Même Guido admet que restreindre Python est dur Neopythonic.blogspot.com/2009/ 03 / Capacités-for-python.htm l



0
votes

Vous pouvez implémenter un sous-ensemble de Python à l'aide du Ast Module à analyser Python Code dans un arbre de syntaxe abstraite puis marchez l'arborescence en vérifiant qu'il utilise uniquement le sous-ensemble de Python que vous autorisez. Cela ne fonctionnera que dans Python 2.x depuis que Python 3 a supprimé le module ast .

Cependant, même en utilisant cette méthode, il sera difficile de créer quelque chose de sécurité à 100%, car même le code le plus inoffensif pourrait permettre à l'utilisateur d'écrire quelque chose qui pourrait faire exploser votre application, par exemple. En allouant plus de mémoire que vous n'avez disponible ou en mettant le programme dans une boucle infinie en utilisant tout le processeur.


1 commentaires

Cette solution est également intéressante et pourrait fonctionner, mon seul problème est que cela utilise une défaillance d'une valeur de défaut au lieu d'une refuge par défaut, ce qui ressemble à un pallarsing.



1
votes

Vous pouvez utiliser PYPARSING pour mettre en œuvre votre DSL, à condition que les expressions impliquées ne soient pas trop complexes. (Vous ne donnez pas de détails complets à ce sujet, mais vous impliquez que les exigences sont assez simples). Voir le Page d'exemples incluant spécifiquement Fourfn.py ou SimpleCalc.py .


2 commentaires

Cela semble être la meilleure suggestion et SimpleCalc prend en charge Certains de ce dont j'ai besoin, mais mon DSL devra également supporter des comparaisons de chaîne insensibles de cas et une sorte de blocs if / autres.


Dans des lignes similaires, quelque chose comme WOLEYE.ORG peut aller un peu plus loin sans vous avoir droit dans les trucs de Python Ast. Voir des exemples dans les docs pour cela. Vous devez toujours écrire votre propre code pour exécuter votre mini-language, mais il semble suffisamment limité qu'il ne semble pas trop grandir pour la pousser à partir de l'un des exemples de calculatrice dans l'un des packages, ni d'autres.



2
votes

PYSANDBOX pourrait aider. Je ne l'ai pas testé, je viens de le trouver lié ailleurs.


0 commentaires