Question Pourquoi l'utilisation de la fonction JavaScript eval est-elle une mauvaise idée?


La fonction eval est un moyen puissant et facile de générer dynamiquement du code, alors quelles sont les mises en garde?


470
2017-09-17 19:09


origine


Réponses:


  1. Mauvaise utilisation de eval ouvre votre code pour les attaques par injection

  2. Débogage peut être plus difficile (pas de numéros de ligne, etc.)

  3. le code eval'd s'exécute plus lentement (aucune possibilité de compiler / cacher le code eval'd)

Edit: Comme le souligne @Jeff Walden dans les commentaires, le n ° 3 est moins vrai aujourd'hui qu'en 2008. Cependant, bien que la mise en cache des scripts compilés puisse se produire, elle sera limitée aux scripts qui sont répétés sans aucune modification. Un scénario plus probable est que vous évaluez les scripts qui ont subi de légères modifications à chaque fois et que, de ce fait, ils ne peuvent pas être mis en cache. Disons simplement que CERTAINS codes d'évaluation s'exécutent plus lentement.


348
2017-09-17 19:17



eval n'est pas toujours mauvais. Il y a des moments où c'est parfaitement approprié.

Cependant, eval est actuellement et massivement surexploité par les personnes qui ne savent pas ce qu'elles font. Cela inclut malheureusement les personnes qui écrivent des didacticiels JavaScript et, dans certains cas, cela peut avoir des conséquences sur la sécurité - ou, plus souvent, des bogues simples. Donc, plus nous pouvons faire un point d'interrogation sur eval, mieux c'est. Chaque fois que vous utilisez eval, vous devez vérifier ce que vous faites, car il est fort probable que vous le fassiez de manière plus sûre, plus sûre et plus propre.

Pour donner un exemple trop typique, définir la couleur d'un élément avec un identifiant stocké dans la variable 'Potato':

eval('document.' + potato + '.style.color = "red"');

Si les auteurs du type de code ci-dessus avaient une idée des bases du fonctionnement des objets JavaScript, ils auraient compris que les crochets pouvaient être utilisés à la place des noms de points littéraux, ce qui évite d'avoir recours à eval:

document[potato].style.color = 'red';

... qui est beaucoup plus facile à lire et moins potentiellement bogué.

(Mais alors, quelqu'un qui / savait vraiment / ce qu'ils faisaient dirait:

document.getElementById(potato).style.color = 'red';

ce qui est plus fiable que l'astuce douteuse d'accéder aux éléments DOM directement hors de l'objet document.)


331
2017-09-17 20:27



Je crois que c'est parce qu'il peut exécuter n'importe quelle fonction JavaScript à partir d'une chaîne. Son utilisation facilite l’injection de code malveillant dans l’application.


35
2017-09-17 19:11



Deux points viennent à l’esprit:

  1. Sécurité (mais tant que vous générez la chaîne à évaluer vous-même, cela peut ne pas poser problème)

  2. Performance: jusqu'à ce que le code à exécuter soit inconnu, il ne peut pas être optimisé. (A propos de javascript et de la performance, certainement La présentation de Steve Yegge)


25
2017-09-17 19:20



Passer une entrée utilisateur à eval () constitue un risque de sécurité, mais chaque appel de eval () crée également une nouvelle instance de l'interpréteur JavaScript. Cela peut être un porc de ressources.


20
2017-09-17 19:28



Ce n'est généralement un problème que si vous transmettez une entrée utilisateur Eval.


17
2017-09-17 19:12



Principalement, c'est beaucoup plus difficile à maintenir et déboguer. C'est comme un goto. Vous pouvez l'utiliser, mais il est plus difficile de trouver des problèmes et plus difficile pour les personnes susceptibles de devoir apporter des modifications ultérieurement.


15
2017-09-17 19:12



Une chose à garder à l'esprit est que vous pouvez souvent utiliser eval () pour exécuter du code dans un environnement autrement restreint - les sites de réseaux sociaux qui bloquent des fonctions JavaScript spécifiques peuvent parfois être bernés en les décomposant dans un bloc eval -

eval('al' + 'er' + 't(\'' + 'hi there!' + '\')');

Donc, si vous cherchez à exécuter du code JavaScript où il ne serait pas autorisé autrement (Mon espace, Je te regarde ...) alors eval () peut être une astuce utile.

Cependant, pour toutes les raisons mentionnées ci-dessus, vous ne devriez pas l'utiliser pour votre propre code, où vous avez un contrôle complet - ce n'est tout simplement pas nécessaire, et mieux vaut reléguer au «piège du piratage JavaScript».


12
2017-09-17 21:23