Executando verificação de segurança...
4

O eval() do Python e seus perigos.

Você sabia que o Python tem uma função chamada "eval()"? Ela permite que você execute uma string como código Python, ou seja, você pode inserir uma string e ela será interpretada como um comando Python válido. Isso é incrivelmente poderoso, mas também extremamente perigoso, pois permite que código malicioso seja executado sem que você saiba. Veja esse exemplo de script:

x = input("Insira um comando Python válido: ")
eval(x)

Se você inserir, por exemplo, "print('Olá, mundo!')" a função "eval()" irá interpretar essa string como o comando Python "print('Olá, mundo!')" e imprimir "Olá, mundo!" na tela. Mas se alguém inserir "import os; os.system('rm -rf /')" a função "eval()" irá interpretar essa string como comando de sistema e deletar todo o conteúdo do diretório raiz. Isso é algo que deve ser usado com extrema cautela e nunca confiar em entrada de usuário sem validar antes.
Em resumo, a função "eval()" é uma ferramenta poderosa e útil, mas também pode ser perigosa se usada de forma incorreta.

É importante sempre pensar duas vezes antes de usá-la e tomar medidas de segurança para evitar possíveis problemas."

Aqui um exemplo de um uso seguro da função eval()

Meu exemplo ficou estranho, sem sintaxe, então o Diegiwg corrigiu e adicionei a identação correta! Foi super bacana a adição dele ao conteudo! Obrigado Diegiwg!


import ast

def secure_eval(expression):
    try:
        node = ast.parse(expression, mode="eval")
    except SyntaxError:
        return None

    restricted_names = {"__builtins__": {}}
    safe_expression = compile(
        node, "<string>", "eval", flags=ast.PyCF_ONLY_AST, dont_inherit=True
    )
    try:
        return eval(safe_expression, restricted_names)
    except Exception:
        return None


user_command = input("Insira um comando Python válido: ")

eval_command = secure_eval(user_command)

if eval_command is not None:
    print(eval_command)
else:
    print("Entrada inválida ou potencialmente perigosa.")
Carregando publicação patrocinada...
2

Informação top pra mim, estou começando com python, até o momento tô bem no basico entendendo que dentro do python existem varias funções. Qualquer coisa que basica que queremos fazer a linguagem já tem pronta, só que como é muita coisa que tem no pyhton, estou sentindo dificuldade em entender cada função "nativa" dessa. Seria legal se você fizesse mais desses resumos com outras nesse formato em... Parabéns, vai ajudar muitas pessoas como eu!

1

A dica é boa, mas na prática, vc raramente vai precisar de eval.

Geralmente vc usa um parser específico pra cada situação. Por exemplo, para código Python tem o ast já citado, para expressões numéricas existem módulos como o numexpr, e por aí vai.

Claro que em um ambiente controlado, se souber o que está fazendo, um eval não vai fazer tão mal. Mas se vc vai aceitar entradas do usuário (ou seja, ele pode digitar qualquer coisa), aí tem que tomar cuidado e validar os dados (e se possível, restringir e usar parsers específicos para cada situação).

2
1

Eu como iniciante em Python ainda não tenho noção de todas essas dimensões.

Realmente muito obrigado por alertar desde já.

Quem sabe no futuro eu entenda mais, e com certeza lembrarei do exemplo.

Excelente conteúdo.

1

não sabia da existencia do eval no python, tô fazendo um projeto no discord de um bot geral tipo a loritta e o eval pode ser bem util para comandos de calculo tipo calculadoras, tem algum outro jeito mais seguro e não tão complicado de fazer isso?