eval()
ejecuta una cadena de caracteres como código. Utiliza eval()
precisamente porque el contenido de la cadena no se conoce de antemano, o incluso se genera en el lado del servidor; Básicamente, necesita eval()
porque el propio JavaScript generará la cadena a partir de datos que solo están disponibles de forma dinámica, en el cliente.
Por lo tanto, eval()
tiene sentido en situaciones donde el código JavaScript generará código. Esto no es intrínsecamente malo , pero es difícil hacerlo de manera segura. Los lenguajes de programación están diseñados para permitir que un ser humano escriba instrucciones que una computadora entiende; a tal efecto, cualquier lenguaje está lleno de pequeñas peculiaridades y comportamientos especiales que se supone que ayudan al programador humano (por ejemplo, la adición automática de ';' al final de algunas declaraciones en JavaScript). Todo esto es muy bueno para la programación "normal"; pero cuando genere el código de otro programa, basándose en datos que pueden ser potencialmente hostiles (por ejemplo, un fragmento de cadena de otros usuarios del sitio), debe, como desarrollador del generador de código, conocer < em> todos estos caprichos, y evita que los datos hostiles los exploten de maneras dañinas.
En ese sentido, los generadores de código (y, por lo tanto, eval()
) incurren en los mismos problemas conceptuales que el SQL sin formato y su consecuencia, ataques de inyección SQL . Reunir en tiempo de ejecución una solicitud de SQL a partir de parámetros provistos externamente se puede hacer de manera segura, pero esto requiere una gran cantidad de detalles, por lo que el consejo habitual es no hacerlo. Esto se relaciona con el enigma habitual de la seguridad, es decir, que no es comprobable: puede probar si alguna parte del código funciona correctamente con datos correctos, pero no que nunca funcione incorrectamente con datos incorrectos. De manera similar, es posible usar eval()
de forma segura, pero en la práctica es tan difícil que no se recomienda.
Todo esto se dice en toda la generalidad. En su contexto específico, eval()
podría ser seguro. Sin embargo, se requiere cierto esfuerzo para tener un contexto seguro para el uso de eval()
, que realmente necesita eval()
.