Eval
Eninformatique,dans certainslangages de programmation,la fonctionevalest unefonctionutilisée enprogrammation.Elle est présente dans de nombreux langages interprétés, commeLisp,Python,PHP,JavaScript,et permet d'exécuter une commande à partir d'unechaîne de caractères (ou String)générée par leprogrammelui-même en cours d'exécution.
Fonctionnement
[modifier|modifier le code]Voici un exemple en PHP, ces deux lignes sont absolument équivalentes:
$c=1+$b;echo$c;
eval('$c = 1 + $b; echo $c;');
Une évaluation à travers une chaîne de caractères au cours de l'exécution permet facilement de:
- Placer du code dans unebase de donnéespour 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 à unevariableou une fonction à partir de son nom
- Protéger du code (en décodant à la volée lecode sourceprotégé)
Puisqu'un programme utilisantevalne peut pas être complètement compilé (on peut toujours avoir besoin d'un élément dans uneval,donc nombre d'optimisations habituelles sont très compliquées), ces programmes sont par nature plus lents qu'un programme compilé[réf. nécessaire].Ceci en considérant qu'on utiliseevalsans en avoir besoin, car ses raccourcis d'écriture permettent une programmation plus rapide.
Malgré la puissance de cette fonction et de ses possibilités,evaln'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ée[Par qui?]comme « superflue » et « sale »[réf. nécessaire].
Problème de sécurité
[modifier|modifier le code]Evalpose un problème au niveau de lasécuritéen PHP, surtout pour les programmes qui ont 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 parevalenPHP:
$input=$_POST['action'];
eval($input)
- codehtml
ne permet que "Connexion()" "Deconnexion()" et "Lecture()"
- Attaque
créer sa propre page html qui entre une autre valeur comme "HidingAccess()"
- Protection
vérifier avant de lancer eval que$inputfait partie des valeurs autorisées.
Quelques conseils pour éviter des problèmes avec eval:
- TOUJOURS vérifier une valeur entrée dansevalsi elle dépend d'une donnée extérieure
- Si$inputest une valeur parmi une liste de valeurs, vérifier que$inputest bien dedans (cela est valable aussi pour les fonctionsincludeetrequireen PHP)
- Ne JAMAIS faire confiance aux entrées de l'utilisateur (ceci est valable pour toutes les entrées 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 fonctionmysql_escape_stringprotège les accès aux bases de données,html_entitiesprotège les affichagesHTML).
- Ce n'est pas parce que$inputne présente pas de danger pour le programme que vous faites qu'il ne faut pas penser aux autres programmes liés (le HTML oubase de donnéesliés souvent à du code PHP)
- Si vous attendez un chiffre, vérifiez que c'est un chiffre, si vous attendez un nom, vérifiez que c'est un nom. Souvent, les langages utilisantevaln'ont pas de variables typées. Et lesis_digitouis_booleansont faits pour ces cas-là.