eval:
Isso é muito poderoso, mas também é muito perigoso se você aceitar seqüências de caracteres para avaliar a partir de informações não confiáveis. Suponha que a string que está sendo avaliada seja "os.system ('rm -rf /')"? Ele realmente começará a excluir todos os arquivos do seu computador.
ast.literal_eval:
avalie com segurança um nó de expressão ou uma string que contém uma exibição literal de container ou contêiner do Python. A cadeia ou nó fornecido pode consistir apenas nas seguintes estruturas literais do Python: cadeias, bytes, números, tuplas, listas, dictos, conjuntos, booleanos, Nenhum, bytes e conjuntos.
Sintaxe:
eval(expression, globals=None, locals=None)
import ast
ast.literal_eval(node_or_string)
Exemplo:
# 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__':{}})
No código acima, ().__class__.__bases__[0]
nada além de objeto em si. Agora que instanciamos todas as subclasses , aqui nosso enter code here
objetivo principal é encontrar uma classe chamada n a partir dela.
Precisamos code
objetar e function
objetar a partir de subclasses instanciadas. Essa é uma maneira alternativa de CPython
acessar subclasses de objeto e anexar o sistema.
A partir do python 3.7, ast.literal_eval () agora é mais rigoroso. A adição e subtração de números arbitrários não são mais permitidas. ligação
ast.literal_eval("1 & 1")
irá lançar um erro, maseval("1 & 1")
não irá.