574 votes

Pourquoi utilise la fonction JavaScript eval une mauvaise idée ?

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

407voto

Prestaul Points 31986
  1. Une mauvaise utilisation de eval ouvre votre code pour les attaques par injection

  2. Le débogage peut être plus difficile (pas de numéro de ligne, etc.)

  3. eval avais le code s'exécute plus lentement (pas de possibilité de compiler/cache eval avais le code)

Edit: @Jeff Walden points dans les commentaires, n ° 3 est moins vrai aujourd'hui qu'il ne l'était en 2008. Cependant, alors que certains la mise en cache des scripts compilés peut arriver, ce ne sera limitée que pour les scripts qui sont eval avait répété sans modification. Un scénario plus probable est que vous êtes eval avec des scripts qui ont subi une légère modification à chaque fois et en tant que telle n'a pas pu être mis en cache. Disons simplement que CERTAINS eval avais le code s'exécute plus lentement.

353voto

bobince Points 270740

eval n'est pas toujours le mal. Il y a des moments où il est parfaitement approprié.

Cependant, eval est actuellement et historiquement massivement sur-utilisé par des gens qui ne savent pas ce qu'ils font. Qui comprend les gens écrire des tutoriels JavaScript, malheureusement, et dans certains cas, cela peut en effet avoir des conséquences sur la sécurité - ou, plus souvent, de simples bugs. Si l'on peut faire de plus pour lancer une interrogation sur la fonction eval, mieux c'est. Tout moment vous utilisez la fonction eval vous avez besoin pour la santé mentale-vérifier ce que vous faites, parce que les chances sont que vous pourriez faire un meilleur, plus sûr, plus propre.

Pour donner un trop typique exemple, pour définir la couleur d'un élément avec un id stocké dans la variable 'pommes de terre':

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

Si les auteurs de la sorte de code ci-dessus a eu une idée sur les principes de base de la façon dont des objets en JavaScript, ils ont réalisé que les crochets peuvent être utilisés à la place de littéral dot-noms, éliminant ainsi la nécessité pour les eval:

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

...ce qui est beaucoup plus facile à lire ainsi que potentiellement moins buggé.

(Mais alors, quelqu'un qui /vraiment/ savaient ce qu'ils faisaient dirais:

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

ce qui est plus fiable que l'douteux vieux truc de l'accès à des éléments du DOM tout droit sorti de l'objet document.)

39voto

Kevin Points 57797

Je crois que c’est parce qu’il peut exécuter toutes les fonctions JavaScript d’une chaîne. Utiliser le rend plus facile pour les gens d’injecter du code de voyous dans l’application.

28voto

xtofl Points 22333

Deux points viennent à l’esprit :

  1. Sécurité (mais tant que vous générez la chaîne à évaluer vous-même, c’est peut-être pas un problème)
  2. Rendement : jusqu'à ce qu’on ne connaît pas le code à exécuter, il ne peut pas être optimisé. (à propos de javascript et performances, certainement la Présentation de Steve Yegge)

23voto

Andrew Hedges Points 11496

En passant l’entrée d’utilisateur à eval() est un risque pour la sécurité, mais aussi chaque invocation de eval() crée une nouvelle instance de l’interpréteur JavaScript. Cela peut être un gros mangeur de ressources.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X