Eval 1102198 25137997 2008-01-19T01:46:26Z PieRRoBoT 87558 Bot : Remplacement de texte automatisé (-[[HTML]] +[[Hypertext Markup Language|HTML]]) '''Eval''' est une [[Fonction (informatique)|fonction]] utilisée en [[programmation]]. Elle est présente dans de nombreux langages interprétés (Comme le [[PHP: Hypertext Preprocessor|PHP]] ou le [[Javascript]]). Eval permet d'exécuter une commande à partir d'une [[Chaîne de caractères|chaîne de caractères (ou String)]] générée par le [[programme]] lui-même en cours d'exécution. Voici un exemple, ces deux lignes sont absolument équivalentes : a = 1 + b; print c; eval("a = 1 + b; print c:"); Une évaluation à travers une chaîne de caractères au cours de l'exécution permet facilement de : * Placer du code dans une [[base de données]] pour une exécution ultérieure * Permettre quelques raccourcis d'écriture ou des "astuces" pour simplifier la programmation * Exécuter un fichier extérieur * Accéder dynamiquement à une [[variable]] ou une fonction à partir de son nom * Protéger du code (en décodant à la volée le [[code source]] protégé) Puisqu'un programme utilisant ''eval'' ne peut pas être complètement compilé (on peut toujours avoir besoin d'un élément dans un ''eval'', donc nombre d'optimisations habituelles sont très compliquées), ces programmes sont par nature plus lents qu'un programme compilé. Ceci en considérant qu'on utilise ''eval'' sans en avoir besoin, car ses raccourcis d'écriture permettent une programmation plus rapide. De plus, le langage utilisé peut optimiser cette fonction de sorte qu'il est des fois préférables de l'utiliser plutôt que d'essayer d'arriver au même résultat sans ''eval''. Malgré la puissance de cette fonction et de ses possibilités, ''eval'' n'est pas très utilisé. Et ceci car son utilisation rend le code plus complexe à comprendre et en partie car cette fonction est considéré comme "superflue" et "sale". == Problème de sécurité == ''Eval'' est un vrai problème au niveau de la [[sécurité]]. Surtout pour les programmes qui on accès à des données confidentielles. Il est fortement conseillé de vérifier au maximum la façon de générer la chaîne qui sera exécutée. Un exemple d'une attaque par ''eval'' en [[PHP: Hypertext Preprocessor|php]] code php : $imput = POST['action']; eval($imput) code [[html]] : ne permet que "Connexion()" "Deconnexion()" et "Lecture()" Attaque : créer sa propre page html qui entre une autre valeur comme "''HiddingAcces()''" Protection : Vérifier avant de lancer eval que ''$imput'' fait partie des valeurs autorisées. Quelques conseil pour éviter des problèmes avec eval : * TOUJOURS vérifier une valeur entrée dans ''eval'' si elle vient ou est calculée à partir d'une donnée extérieure * Si ''$imput'' est une valeur parmi une liste de valeurs, vérifier que ''$imput'' est bien dedans (cela est valable aussi pour les fonctions ''include'' et ''require'' en PHP) * Ne JAMAIS faire confiance aux entrés de l'utilisateur (ceci est valable pour toutes les entrée dans tous les programmes, mais plus particulièrement pour ces cas-là) L'utilisateur ne se privera pas de mettre votre programme à l'épreuve. * Utiliser au maximum des caractères d'échappement (En PHP, la fonction ''mysql_escape_string'' protège les accès aux base de données, ''html_entities'' protège les affichage [[Hypertext Markup Language|HTML]]). * Ce n'est pas parce que ''$imput'' ne présente pas de danger pour le programme que vous faites qu'il ne faut pas penser aux autres programmes lié (le HTML ou [[base de donnée]] lié souvent à du code PHP) * Si vous attendez un chiffre, vérifier que c'est un chiffre, si vous attendez un nom, vérifier que c'est un nom. Souvent, les langages utilisant ''eval'' n'ont pas de variables typées. Et les ''is_digit'' ou ''is_boolean'' sont faits pour ces cas-là. {{Portail informatique}} [[Catégorie:Programmation informatique]] [[Catégorie:Structure de contrôle]] [[en:Eval]] [[es:Eval]] [[ja:Eval]]