Python: rendre eval sûr [dupliquer]

Cette question a déjà une réponse ici:

Je veux un moyen facile de faire une "API calculatrice" en Python.

En ce moment, je ne me soucie pas beaucoup de l'ensemble exact des fonctionnalités que la calculatrice va prendre en charge.

Je veux qu'il reçoive un string, disons "1+1" et renvoie une chaîne avec le résultat, dans notre cas "2".

Y a-t-il un moyen de rendre eval sûr pour une telle chose?

Pour commencer, je ferais

env = {}
env["locals"]   = None
env["globals"]  = None
env["__name__"] = None
env["__file__"] = None
env["__builtins__"] = None

eval(users_str, env)

Afin que l'appelant ne puisse pas jouer avec mes variables locales (ou les voir).

Mais je suis sûr que je supervise beaucoup ici.

Les problèmes de sécurité de eval sont-ils réparables ou y a-t-il trop de petits détails pour que cela fonctionne correctement?

33
demandé sur vaultah 2010-08-18 18:44:11

4 réponses

Les problèmes de sécurité d'eval sont-ils réparables ou y a t il trop de petits détails pour le faire fonctionner correctement?

Certainement ce dernier - un hacker intelligent parviendra toujours à trouver un moyen de contourner vos précautions.

Si vous êtes satisfait des expressions simples utilisant uniquement des littéraux de type élémentaire, utilisez ast.literal_eval -- c'est à ça que ça sert! Pour tout ce qui est plus chic, je recommande un paquet d'analyse, tel que ply Si vous êtes familier et à l'aise avec l'approche lexx / Yacc classique, ou pyparsing pour une approche peut-être plus pythonique.

47
répondu Alex Martelli 2010-08-18 15:01:38

Il est possible d'accéder à n'importe quelle classe qui a été définie dans le processus, puis vous pouvez l'instancier et appeler des méthodes dessus. Il est possible de segmenter L'interpréteur CPython, ou de le faire quitter. Voir ceci: Eval est vraiment dangereux

8
répondu Ned Batchelder 2012-06-09 20:19:29

Les problèmes de sécurité ne sont pas (même proches) réparables.

Je voudrais utiliser pyparsing pour analyser l'expression dans une liste de jetons (cela ne devrait pas être trop difficile, car la grammaire est simple), puis Gérer les jetons individuellement.

Vous pouvez également utiliser le ast module pour construire un AST Python (puisque vous utilisez une syntaxe Python VALIDE), mais cela peut être ouvert à des trous de sécurité subtils.

2
répondu Katriel 2010-08-18 15:08:30

Perl a un module Eval Sécurisé http://perldoc.perl.org/Safe.html

Googler" équivalent Python de Perl Safe " trouve http://docs.python.org/2/library/rexec.html

Mais ce Python "restricted exec" est obsolète.

--

Dans l'ensemble, la sécurité "eval", dans n'importe quelle langue, est un gros problème. Les attaques par injection SQL ne sont qu'un exemple d'un tel trou de sécurité. Perl Safe a eu des bugs de sécurité au fil des ans-le plus récent, je me souviens, c'était sûr, sauf pour les destructeurs sur les objets renvoyés de l'évaluation sécurisée.

C'est le genre de chose que je pourrais utiliser pour mes propres outils, mais pas web exposé.

Cependant, j'espère qu'un jour des évaluations entièrement sécurisées seront disponibles dans de nombreuses langues .

1
répondu Krazy Glew 2015-01-14 20:21:16