Python >> Tutoriel Python >  >> Python

Python eval()

Ce tutoriel vous montre comment utiliser le eval() intégré de Python fonction.

Pourquoi l'utiliser ? L'application principale de eval() est de prendre l'entrée de l'utilisateur au moment de l'exécution et de l'exécuter en tant qu'expression Python. De cette façon, vous pouvez créer une calculatrice ou permettre aux utilisateurs d'effectuer des calculs personnalisés sur un cluster informatique. Cependant, cette utilisation pose également le plus grand risque de sécurité :l'utilisateur peut exécuter du code byzantin (=nuisible) sur votre environnement de serveur !

Comment ça marche ? TLDR ;

Python eval(s) analyse l'argument de chaîne s dans une expression Python, l'exécute et renvoie le résultat de l'expression. Cela pose un risque de sécurité car un utilisateur peut l'utiliser pour exécuter du code sur votre ordinateur. Par exemple, si vous autorisez eval(input()) , un utilisateur pourrait taper os.system('rm -R *') pour supprimer tous les fichiers de votre répertoire personnel.

Exemples d'utilisation

Apprenez par l'exemple ! Voici quelques exemples d'utilisation du eval() fonction intégrée :

>>> eval('2+2')
4
>>> eval('[1, 2, 3]*3')
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> eval('[x for x in range(10)]')
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> eval('"Alice".replace("e", "")')
'Alic'

Vous pouvez exécuter n'importe quel code Python qui a une valeur de retour dans le eval() code. Vous pouvez même créer votre propre fonction et l'exécuter dans eval() :

>>> def f():
	return 42

>>> eval('f()')
42

Cela vous donne une grande flexibilité dans la façon dont vous utilisez la fonction pour exécuter toute expression de chaîne que vous pouvez rencontrer dans Python et cela vous permet de créer du code Python par programme et de l'évaluer au moment de l'exécution.

Syntaxe eval()

Vous pouvez utiliser le eval() méthode avec trois listes d'arguments différentes.

Syntax: 
eval(string)
eval(string, globals)
eval(string, globals, locals) 
Arguments string Une chaîne à évaluer.
globals Facultatif, None par défaut . Un dictionnaire dans lequel vous pouvez définir des variables qui doivent être accessibles globalement par le object exécuté (espace de noms local).
locals Facultatif, None par défaut . Un dictionnaire dans lequel vous pouvez définir des variables qui doivent être accessibles localement par le object exécuté (espace de noms global).
Valeur de retour object Renvoie le résultat de l'analyse du string argument et l'exécuter en tant qu'expression Python.

Valeur de retour Python eval()

La valeur de retour de eval() est un objet Python qui est le résultat de l'analyse du string argument et en l'exécutant comme une expression Python. Le code peut avoir des effets secondaires ce qui signifie qu'il peut changer l'état de votre programme ou même de votre ordinateur !


Mais avant de continuer, je suis ravi de vous présenter mon nouveau livre Python Python One-Liners (Lien Amazon).

Si vous aimez les one-liners, vous allez adorer le livre. Il vous apprendra tout ce qu'il y a à savoir sur une seule ligne de code Python. Mais c'est aussi une introduction à l'informatique , science des données, apprentissage automatique et algorithmes. L'univers en une seule ligne de Python !

Le livre est sorti en 2020 avec l'éditeur de livres de programmation de classe mondiale NoStarch Press (San Francisco).

Lien :https://nostarch.com/pythononeliners

[Zone de danger] Python eval(input()) Entrée utilisateur

Vous pouvez utiliser le eval() fonction pour exécuter du code saisi dynamiquement par l'utilisateur :

def dangerous_function():
    # Do nasty stuff like removing files
    # or creating trojan horses
    print('You were hacked!')
    return 42

eval(input())

Voici comment l'utilisateur peut interagir avec votre code lors de l'exécution :

dangerous_function()
You were hacked!

42

Vous voyez que la fonction dangereuse () a été exécutée et peut contenir toutes sortes de codes dangereux. Si vous l'exécutez sur votre serveur, l'utilisateur peut tenter de supprimer tous les fichiers de votre serveur ! Par exemple, l'utilisateur peut utiliser la commande os.system('rm -rf *') pour supprimer tous les fichiers et dossiers.

Évaluation interactive du bloc-notes Jupyter()

Exercice  :Exécutez le code interactif suivant et essayez d'exécuter la fonction dangereuse dans le bloc-notes interactif Jupyter !


Python exec() contre eval()

exec() de Python La fonction prend un programme Python, sous forme de chaîne ou d'objet exécutable, et l'exécute. Le eval() La fonction évalue une expression et renvoie le résultat de cette expression. Il existe deux différences principales :

  • exec() peut exécuter tout le code source Python, alors que eval() ne peut évaluer que des expressions.
  • exec() renvoie toujours None , alors que eval() renvoie le résultat de l'expression évaluée.
  • exec() peut importer des modules, alors que eval() ne peux pas.
exec('x=2;y=2;z=x*y;print(z)')
# 4

print(eval('2*2'))
# 4

Importer Python eval()

Pouvez-vous importer une bibliothèque Python dans le eval() fonction? Non, vous ne pouvez pas ! Le import déclaration est une déclaration, pas une expression. Mais eval() ne peut exécuter que des expressions. Une solution simple consiste à créer une fonction avec des effets secondaires qui importe le module dans le corps de la fonction :

def f():
    import random
    return random.randint(0, 9)

print(eval('f()'))
# 4

Par défaut, le eval() la fonction a accès à tous les noms dans le dir() espace de noms, de sorte que vous pouvez également importer la bibliothèque globalement et l'utiliser dans le eval() fonction :

import random
print(eval('random.randint(0, 9)'))

Comment restreindre l'utilisation des fonctions intégrées dans eval()

Si vous ne souhaitez pas autoriser les utilisateurs à accéder aux fonctions intégrées, vous pouvez limiter cela en fournissant le globals argument comme suit :

eval(expression, {'__builtins__': None})

Par exemple :

>>> eval('sum([1, 2, 3])')
6
>>> eval('sum([1, 2, 3])', {'__builtins__': None})
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    eval('sum([1, 2, 3])', {'__builtins__': None})
  File "<string>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable

Après avoir restreint les fonctions intégrées dans le deuxième appel, Python génère une erreur NoneType object is not subscriptable . Cela réduit les risques de sécurité de votre application.

Résumé

Python eval(s) analyse l'argument de chaîne s dans une expression Python, l'exécute et renvoie le résultat de l'expression.

>>> eval('2+2')
4

Cela pose un risque de sécurité car un utilisateur peut l'utiliser pour exécuter du code sur votre ordinateur. Par exemple, si vous autorisez eval(input()) , un utilisateur pourrait taper import os; os.system('rm -R *') pour supprimer tous les fichiers de votre répertoire personnel.


J'espère que vous avez apprécié l'article! Pour améliorer votre formation Python, vous pouvez rejoindre la populaire et gratuite Finxter Email Academy :

Voulez-vous améliorer vos compétences Python d'une manière amusante et facile à consommer ? Considérez les ressources suivantes et devenez un maître codeur !


Post précédent