Question

Je recherche une fonction d'évaluation "sûre", pour implémenter des calculs de type feuille de calcul (en utilisant numpy/scipy).

La fonctionnalité pour ce faire (le module rexec) a été supprimé de Python depuis la version 2.3 en raison de problèmes de sécurité apparemment irréparables.Il existe plusieurs hacks tiers qui prétendent faire cela - la solution la plus réfléchie que j'ai trouvée estcette recette de Python Cookbook, "safe_eval".

Suis-je raisonnablement en sécurité si j'utilise ceci (ou quelque chose de similaire) pour me protéger contre le code malveillant, ou suis-je obligé d'écrire mon propre analyseur ?Quelqu'un connaît-il de meilleures alternatives ?

MODIFIER:je viens de découvrir Python restreint, qui fait partie de Zope.Tous les avis à ce sujet sont les bienvenus.

Était-ce utile?

La solution

Cela dépend de votre définition du coffre-fort, je suppose.Une grande partie de la sécurité dépend de ce que vous transmettez et de ce que vous êtes autorisé à transmettre dans le contexte.Par exemple, si un fichier est transmis, je peux ouvrir des fichiers arbitraires :

>>> names['f'] = open('foo', 'w+')
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names)
>>> names['baz']
<open file 'baz', mode 'w+' at 0x413da0>

De plus, l'environnement est très restreint (vous ne pouvez pas transmettre de modules), vous ne pouvez donc pas simplement transmettre à un module des fonctions utilitaires comme re ou random.

D'un autre côté, vous n'avez pas besoin d'écrire votre propre analyseur, vous pouvez simplement écrire votre propre évaluateur pour python ast :

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")

De cette façon, nous espérons que vous pourrez mettre en œuvre des importations sûres.L'autre idée est d'utiliser Jython ou IronPython et de profiter des capacités de sandboxing Java/.Net.

Autres conseils

Écrire votre propre analyseur pourrait être amusant !Cela pourrait être une meilleure option car les gens s'attendent à utiliser la syntaxe familière des feuilles de calcul (Excel, etc.) et non Python lorsqu'ils saisissent des formules.Je ne connais pas safe_eval mais j'imagine que quelque chose comme ça a certainement un potentiel d'exploitation.

Bien que ce code semble assez sécurisé, j'ai toujours été d'avis que toute personne suffisamment motivée pouvait le déchiffrer si elle avait suffisamment de temps.Je pense qu'il faudra beaucoup de détermination pour s'en sortir, mais je suis relativement sûr que cela pourrait être fait.

Si vous avez simplement besoin d'écrire et de lire une structure de données en Python et que vous n'avez pas besoin de la capacité réelle d'exécuter du code personnalisé, celle-ci est mieux adaptée :http://code.activestate.com/recipes/364469-safe-eval/

Il garantit qu'aucun code n'est exécuté, seules les structures de données statiques sont évaluées :chaînes, listes, tuples, dictionnaires.

Daniel,Jinja implémente un environnement sandbox qui peut ou non vous être utile.D'après ce dont je me souviens, il ne "comprend" pas encore les compréhensions de listes.

Informations sur la Sanbox

La fonctionnalité souhaitée se trouve dans les services de langage du compilateur, voirhttp://docs.python.org/library/langue.htmlSi vous définissez votre application pour qu'elle accepte uniquement les expressions, vous pouvez compiler l'entrée en tant qu'expression et obtenir une exception si ce n'est pas le cas, par exemple.s'il y a des points-virgules ou des formulaires de déclaration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top