Python Language Evaluer une chaîne contenant un littéral Python avec ast.literal_eval


Exemple

Si vous avez une chaîne qui contient des littéraux Python, tels que des chaînes, des flottants, etc., vous pouvez utiliser ast.literal_eval pour évaluer sa valeur au lieu de eval . Cela a pour caractéristique supplémentaire de n'autoriser qu'une certaine syntaxe.

>>> import ast
>>> code = """(1, 2, {'foo': 'bar'})"""
>>> object = ast.literal_eval(code)
>>> object
(1, 2, {'foo': 'bar'})
>>> type(object)
<class 'tuple'>

Cependant, ceci n'est pas sécurisé pour l'exécution du code fourni par un utilisateur non fiable, et il est trivial d'interrompre un interpréteur avec une entrée soigneusement conçue.

>>> import ast
>>> ast.literal_eval('()' * 1000000)
[5]    21358 segmentation fault (core dumped)  python3

Ici, l'entrée est une chaîne de caractères () répétée un million de fois, ce qui provoque un blocage de l'analyseur CPython. Les développeurs CPython ne considèrent pas les bogues de l'analyseur comme des problèmes de sécurité.