A maioria das línguas modernas (que são de alguma forma interpretadas) têm algum tipo de eval função. Essa função executa código de idioma arbitrário, na maioria das vezes passado como argumento principal como uma string (idiomas diferentes podem adicionar mais recursos à função eval).
Entendo que os usuários não devem ter permissão para executar essa função ( editar, ou seja, receber diretamente ou indiretamente informações arbitrárias de um usuário arbitrário para serem repassados eval
), especialmente com o software do servidor, pois podem forçar o processo a executar código malicioso. Dessa forma, tutoriais e comunidades nos dizem para não usar o eval. No entanto, há muitas vezes em que eval é útil e usado:
- Regras de acesso personalizadas para elementos de software (IIRC OpenERP possui um objeto
ir.rule
que pode usar código python dinâmico). - Cálculos e / ou critérios personalizados (o OpenERP possui campos como esse para permitir cálculos de código personalizados).
- Analisadores de relatórios do OpenERP (sim, eu sei que estou assustando você com coisas do OpenERP ... mas é o principal exemplo que tenho).
- Codificando efeitos de feitiço em alguns jogos de RPG.
Portanto, eles têm um bom uso, desde que sejam usados corretamente. A principal vantagem é que o recurso permite que os administradores escrevam códigos personalizados sem precisar criar mais arquivos e incluí-los (embora a maioria das estruturas que usam os recursos eval também tenham uma maneira de especificar um arquivo, módulo, pacote, ... para ler).
No entanto, eval é mau na cultura popular. Coisas como invadir seu sistema vêm à mente.
No entanto, existem outras funções que podem ser prejudiciais se, de alguma forma, forem acessadas pelos usuários: desvincular, ler, escrever (semântica de arquivos), alocação de memória e aritmética de ponteiros, acesso ao modelo de banco de dados (mesmo que não considerando casos injetáveis por SQL).
Portanto, basicamente, na maioria das vezes, quando qualquer código não é gravado corretamente ou não é monitorado adequadamente (recursos, usuários, ambientes, ...), o código é ruim e pode levar até a um impacto econômico.
Mas há algo especial com eval
funções (independentemente do idioma).
Pergunta : Existe algum fato histórico para esse medo se tornar parte da cultura popular, em vez de dar a mesma atenção aos outros aspectos possivelmente perigosos?
eval
, ele possui uma função interna chamada safe_eval
que prepara o ambiente para impedir que o código faça coisas perigosas. Porém, foram encontrados erros, já que o Python é uma linguagem bastante flexível e, portanto, difícil de controlar.