La mayoría de los lenguajes modernos (que de alguna manera se interpretan) tienen algún tipo de función eval . Dicha función ejecuta un código de lenguaje arbitrario, la mayoría de las veces pasa como argumento principal como una cadena (diferentes idiomas pueden agregar más características a la función eval).
Entiendo que a los usuarios no se les debe permitir ejecutar esta función ( editar, es decir, tomar información arbitraria directa o indirectamente de un usuario arbitrario al que se pasará eval
), especialmente con el software del lado del servidor, ya que podrían obligar al proceso a ejecutar código malicioso. De esa manera, los tutoriales y las comunidades nos dicen que no usemos eval. Sin embargo, hay muchas veces en que eval es útil y utilizado:
- Reglas de acceso personalizadas a elementos de software (IIRC OpenERP tiene un objeto
ir.rule
que puede usar código dinámico de Python). - Cálculos y / o criterios personalizados (OpenERP tiene campos como ese para permitir cálculos de códigos personalizados).
- Analizadores de informes de OpenERP (sí, sé que te estoy volviendo loco con las cosas de OpenERP ... pero es el principal ejemplo que tengo).
- Codificación de efectos de hechizo en algunos juegos de rol.
Por lo tanto, tienen un buen uso, siempre que se usen correctamente. La principal ventaja es que la característica permite a los administradores escribir código personalizado sin tener que crear más archivos e incluirlos (aunque la mayoría de los marcos que usan características de evaluación también tienen una forma de especificar un archivo, módulo, paquete, ... para leer).
Sin embargo, eval es malo en la cultura popular. Me vienen a la mente cosas como irrumpir en su sistema.
Sin embargo, hay otras funciones que podrían ser perjudiciales si los usuarios acceden de alguna manera: desvincular, leer, escribir (semántica de archivos), asignación de memoria y aritmética de puntero, acceso al modelo de base de datos (incluso si no se consideran casos inyectables con SQL).
Entonces, básicamente, la mayoría de las veces cuando un código no se escribe correctamente o no se mira correctamente (recursos, usuarios, entornos, ...), el código es malo y puede conducir incluso a un impacto económico.
Pero hay algo especial con las eval
funciones (independientemente del idioma).
Pregunta : ¿Existe algún hecho histórico para que este miedo se convierta en parte de la cultura popular, en lugar de prestar la misma atención a las otras características posiblemente peligrosas?
eval
, tiene una función interna llamada safe_eval
que prepara el entorno para evitar que el código haga cosas peligrosas. Sin embargo, se han encontrado errores, ya que Python es un lenguaje bastante flexible y, por lo tanto, difícil de controlar.