eval:
Ceci est très puissant, mais est également très dangereux si vous acceptez des chaînes à évaluer à partir d'une entrée non approuvée. Supposons que la chaîne évaluée soit "os.system ('rm -rf /')"? Il commencera vraiment à supprimer tous les fichiers de votre ordinateur.
ast.literal_eval:
évalue 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, dictées, ensembles, booléens, Aucun, 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 que nous avons instancié toutes les sous - classes , ici notre enter code here
objectif principal est de trouver une classe nommée n à partir de celle-ci.
Nous avons besoin d' code
objecter et d' function
objecter à partir de sous-classes instanciées. Il s'agit d'une autre manière d' CPython
accéder aux sous-classes d'objets et d'attacher le système.
Depuis python 3.7, ast.literal_eval () est désormais plus stricte. L'addition et la soustraction de nombres arbitraires ne sont plus autorisées. lien
ast.literal_eval("1 & 1")
lancera une erreur maiseval("1 & 1")
ne le fera pas.