En Perl existen dos sintaxis para la construcción eval:
Características del manejo de errores:
$@ contiene el texto del error (si hubo un error), de lo contrario, $@ está vacío.eval BLOCK es más rápido, más seguro y preferible cuando no se requiere ejecutar código dinámico.eval STRING es conveniente para la creación dinámica de código, pero compila la cadena además, lo que lo hace más lento y potencialmente más peligroso.# Ejemplo de uso de eval BLOCK my $result = eval { die "¡Error!" a menos que 1 + 1 == 2; return "OK"; }; if ($@) { warn "Error capturado: $@"; } # Ejemplo de uso de eval STRING my $code = '$x = 1 + 2; $x;'; my $res = eval $code; if ($@) { warn "Error en string de eval: $@"; }
Si se insertan variables dinámicas dentro de eval STRING sin el debido escape, ¿pueden surgir riesgos adicionales?
Sí, si la cadena insertada se forma a partir de variables, especialmente aquellas obtenidas externamente (por ejemplo, de la entrada del usuario), hay una amenaza de seguridad/injection. Siempre se debe usar el escape o no usar eval STRING para datos ajenos.
my $user_code = 'system("rm -rf /");'; eval $user_code; # ¡MUY PELIGROSO!
Historia
En un script de auditoría para verificar los parámetros de máquinas virtuales, se utilizó eval STRING, en el que "por error" se incluían datos leídos de un archivo de configuración externo. Una vez, el archivo fue sustituido, lo que llevó a la ejecución de código del atacante y a la comprometición del servidor.
Historia
Un desarrollador envolvió una parte del código potencialmente problemática en eval BLOCK, esperando que "capturara" no solo errores en tiempo de ejecución, sino también errores en tiempo de compilación (por ejemplo, errores de sintaxis). Pero un error de sintaxis (por ejemplo, un error tipográfico en el nombre de una variable) no es capturado por eval BLOCK — provocó un cierre inesperado del proceso.
Historia
Al deserializar estructuras de datos complejas a través de eval STRING después de un volcado de Dumper, olvidaron asegurarse de que la cadena contenía únicamente código Perl válido — un usuario, mediante inyección de entrada, añadió código ejecutable, lo que llevó a la ejecución de comandos maliciosos en el servidor.