En Perl, il existe deux syntaxes pour la construction eval :
Particularités de gestion des erreurs :
$@ (si une erreur s'est produite), sinon $@ est vide.eval BLOCK est plus rapide, plus sûr et préférable lorsqu'il n'est pas nécessaire d'exécuter du code dynamique.eval STRING est pratique pour la création dynamique de code, mais compile la chaîne en plus, ce qui est plus lent et potentiellement plus dangereux.# Exemple d'utilisation de eval BLOCK my $result = eval { die "Erreur!" unless 1 + 1 == 2; return "OK"; }; if ($@) { warn "Erreur interceptée : $@"; } # Exemple d'utilisation de eval STRING my $code = '$x = 1 + 2; $x;'; my $res = eval $code; if ($@) { warn "Erreur dans la chaîne eval : $@"; }
Si des variables dynamiques non correctement échappées sont insérées dans eval STRING, des risques supplémentaires peuvent-ils survenir ?
Oui, si la chaîne insérée est formée à partir de variables, surtout celles provenant de l'extérieur (par exemple, des entrées utilisateur), il y a un risque de sécurité/injection. Il est toujours nécessaire d'utiliser un échappement ou de ne pas utiliser eval STRING pour des données externes.
my $user_code = 'system("rm -rf /");'; eval $user_code; # TRÈS DANGEREUX !
Histoire
Dans un script d'audit pour vérifier les paramètres des machines virtuelles, eval STRING a été utilisé, dans lequel des données s'étaient "insérées par erreur" à partir d'un fichier de configuration externe. Un jour, le fichier a été remplacé, ce qui a conduit à l'exécution du code d'un attaquant et à la compromission du serveur.
Histoire
Un développeur a enveloppé une partie du code potentiellement défaillante dans eval BLOCK, s'attendant à ce qu'il "intercepte" non seulement les erreurs d'exécution, mais aussi les erreurs de compilation (par exemple, les erreurs de syntaxe). Mais une erreur de syntaxe (par exemple, une faute de frappe dans le nom d'une variable) n'est pas interceptée par eval BLOCK — elle a provoqué une rupture du processus.
Histoire
Lors de la désérialisation de structures de données complexes via eval STRING après un Dump, il a été oublié de s'assurer que la chaîne ne contenait que du code Perl valide — un utilisateur a ajouté du code exécutable par injection d'entrée, ce qui a conduit à l'exécution de commandes malveillantes sur le serveur.