Mes excuses Fred
C'était une boutade à la base, et j'en ait remis une louche bien inutile
Version imprimable
Bonjour,
Il est vrai que la fonction eval est en même temps pratique et dangereuse.
Par exemple, on croit qu'elle ne sait qu'évaluer des expressions du genre "2+3*7", mais en fait, elle est capable d'importer n'importe quel module et d'exécuter à peu près n'importe quoi (désolé, mais je ne dirai pas comment ici).
Cependant, on ne peut pas toujours y échapper. Par exemple quand on crée une calculatrice et qu'on invite les utilisateurs à rentrer des expressions.
Alors, on peut faire un minimum en créant une fonction eval2(expression), qui commencera par faire 3 choses (avec des expressions régulières):
- interdire un nom de variable ou de fonction de type système: "__xxx__"
- interdire la fonction eval elle-même
- interdire la fonction exec
On peut aussi s'assurer du contenu des dictionnaires associés de la fonction eval (globals et locals)
Ce n'est pas une sécurité parfaite, mais on se prémunie déjà pas mal des astuces courantes.
Et si quelqu'un a des astuces qui pourraient passer malgré ça, ça m’intéresse! (me les donner par mp).
Dans le module ast il y a literal_eval() pour cela
https://docs.python.org/3/library/as...t.literal_eval
Bonjour,
Merci pour l'idée, VinsS. J'avais déjà essayé literal_eval() du module ast, mais il est malheureusement beaucoup trop limité pour une calculatrice.
Il sait effectivement calculer une expression simple comme "2+3", mais pas une expression contenant des fonctions comme par exemple "sin(0.5)" du module math, ou n'importe quelle autre fonction. Et comme il ne supporte pas l'apport d'un dictionnaire de variables comme le fait eval, on ne peut pas les utiliser non plus.
C'est bien dommage: il faudrait une version intermédiaire entre les 2 solutions.
Bonjour Tyrtamos,
En ce qui me concerne, je travaillerai avec Sympy ;)
Bonjour fred1599.
Merci, je vais essayer!