eval:
Dies ist sehr mächtig, aber auch sehr gefährlich, wenn Sie Zeichenfolgen akzeptieren, die aus nicht vertrauenswürdigen Eingaben ausgewertet werden sollen. Angenommen, die zu bewertende Zeichenfolge lautet "os.system ('rm -rf /')"? Es werden wirklich alle Dateien auf Ihrem Computer gelöscht.
ast.literal_eval:
Bewerten Sie sicher einen Ausdrucksknoten oder eine Zeichenfolge, die ein Python-Literal oder eine Containeranzeige enthält. Die bereitgestellte Zeichenfolge oder der bereitgestellte Knoten darf nur aus den folgenden Python-Literalstrukturen bestehen: Zeichenfolgen, Bytes, Zahlen, Tupel, Listen, Diktate, Mengen, Boolesche Werte, Keine, Bytes und Mengen.
Syntax:
eval(expression, globals=None, locals=None)
import ast
ast.literal_eval(node_or_string)
Beispiel:
# 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__':{}})
Im obigen Code ().__class__.__bases__[0]
nichts als Objekt selbst. Jetzt haben wir alle Unterklassen instanziiert . Hier besteht unser enter code here
Hauptziel darin, eine Klasse mit dem Namen n daraus zu finden.
Wir müssen Einwände erheben code
und function
Einwände gegen instanziierte Unterklassen erheben. Dies ist eine alternative Möglichkeit, CPython
um auf Unterklassen von Objekten zuzugreifen und das System anzuhängen.
Ab Python 3.7 ist ast.literal_eval () jetzt strenger. Das Addieren und Subtrahieren beliebiger Zahlen ist nicht mehr zulässig. Verknüpfung
ast.literal_eval("1 & 1")
wird einen Fehler auslösen, abereval("1 & 1")
nicht.