eval : C'est très puissant, mais aussi très dangereux si vous acceptez d'évaluer des chaînes de caractères provenant d'une entrée non fiable. Supposons que la chaîne à évaluer soit "os.system('rm -rf /')" ? Elle commencera vraiment à effacer tous les fichiers de votre ordinateur.
ast.literal_eval : Évaluer en toute sécurité un nœud d'expression ou une chaîne contenant un littéral Python ou un affichage de conteneur. La chaîne ou le nœud fourni ne peut être constitué que des structures littérales Python suivantes : chaînes, octets, nombres, tuples, listes, dicts, ensembles, booléens, None, octets et ensembles.
Syntaxe :
eval(expression, globals=None, locals=None)
import ast
ast.literal_eval(node_or_string)
Exemple :
# python 2.x - doesn't accept operators in string format
import ast
ast.literal_eval('[1, 2, 3]') # output: [1, 2, 3]
ast.literal_eval('1+1') # output: ValueError: malformed string
# python 3.0 -3.6
import ast
ast.literal_eval("1+1") # output : 2
ast.literal_eval("{'a': 2, 'b': 3, 3:'xyz'}") # output : {'a': 2, 'b': 3, 3:'xyz'}
# type dictionary
ast.literal_eval("",{}) # output : Syntax Error required only one parameter
ast.literal_eval("__import__('os').system('rm -rf /')") # output : error
eval("__import__('os').system('rm -rf /')")
# output : start deleting all the files on your computer.
# restricting using global and local variables
eval("__import__('os').system('rm -rf /')",{'__builtins__':{}},{})
# output : Error due to blocked imports by passing '__builtins__':{} in global
# But still eval is not safe. we can access and break the code as given below
s = """
(lambda fc=(
lambda n: [
c for c in
().__class__.__bases__[0].__subclasses__()
if c.__name__ == n
][0]
):
fc("function")(
fc("code")(
0,0,0,0,"KABOOM",(),(),(),"","",0,""
),{}
)()
)()
"""
eval(s, {'__builtins__':{}})
Dans le code ci-dessus ().__class__.__bases__[0]
rien d'autre que l'objet lui-même. Maintenant, nous avons instancié tous les Sous-classes ici notre principal enter code here
L'objectif est de trouver une classe nommée n d'elle.
Nous devons code
et function
des sous-classes instanciées. Il s'agit d'une méthode alternative à CPython
pour accéder aux sous-classes d'objets et attacher le système.
À partir de python 3.7, ast.literal_eval() est désormais plus strict. L'addition et la soustraction de nombres arbitraires ne sont plus autorisées. enlace