IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Le Blog d'un Ninja codeur

[Actualité] [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1)

Noter ce billet
par , 12/04/2015 à 19h14 (2097 Affichages)
Le langage JavaScript étant un langage interprété, il possède la faculté commune aux autres langages interprétés d'évaluer du code JavaScript. De base, il existe une fonction spéciale qui se nomme eval().

Cette fonction est souvent décriée ; un peu pour les traitements supplémentaires causés par l'appel d'un nouvel interpréteur JavaScript, même si c'est relativement négligeable sur des plateformes "normales" ; beaucoup pour les failles de sécurité et d'encapsulation qu'elle permet comme le montre le bout de code ci-dessous :

Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var global = 5;
 
function checkPassword(pass) {
    // ...
    // retourne true ou false
    return false;
}
 
function parseScript() {
    var local = 1;
    eval('var local = 13;');
    eval('var global = 0;');
    alert(local); // ==> x = 13
    alert(global); // ==> g = 0 !!!
    eval('window.checkPassword = function(pass) { return true; }');
}
 
parseScript();
var accessOk = checkPassword('');
alert(accessOk); // ==> true !!!

La fonction eval() utilisée sans précaution peut permettre au script interprété de modifier par inadvertance ou intentionnellement (et dans ce cas de façon malveillante) le code du programme appelant dans la mesure où :
  • d'une part elle ne crée pas de nouveau contexte d'exécution mais s'appuie sur le contexte duquel eval() est appelée. Dans l'exemple, la variable local définie dans la fonction appelante parseScript() et celle définie dans eval(), même en utilisant le mot-clé var, désigne en réalité le même objet.
  • et d'autre part elle a accès à l'objet global window puisqu'objet global justement ce qui est très compromettant d'un point de vue de la sécurité. Le code du script peut ainsi redéfinir tous les objets et toutes les fonctions du programme appelant comme le montre l'exemple avec la fonction checkPassword().


Pour pallier à la première faille, mais qui n'est pas la plus grave, il est possible d'utiliser le mode strict qui oblige eval() à créer son propre contexte d'exécution. Les variables précédées par le mot-clé var seront bien de nouveaux objets indépendants des objets du contexte appelant, même en cas d'homonymie. La fonction eval() se comporte donc comme une fermeture.

Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var global = 5;
 
function checkPassword(pass) {
    // ...
    // retourne true ou false
    return false;
}
 
function parseScript() {
    'use strict';
    var local = 1;
    eval('var local = 13;');
    eval('var global = 0;');
    alert(local); // ==> x = 1
    alert(global); // ==> g = 5
    eval('window.checkPassword = function(pass) { return true; }');
}
 
parseScript();
var accessOk = checkPassword('');
alert(accessOk); // ==> true !!!

Cependant persiste le problème de l'accès aux variables globales qui est le vrai point noir de cette fonction. D'où la phrase fameuse de Douglas Crockford à son sujet : "eval is evil".

Il existe heureusement des solutions pour se passer d'eval(), mais ce n'est pas si simple.
Dans une seconde partie, j'expliquerai comment interpréter du JavaScript de façon fiable.

Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog Viadeo Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog Twitter Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog Google Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog Facebook Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog Digg Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog Delicious Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog MySpace Envoyer le billet « [JS] Interpréter du JavaScript en JavaScript, ce n'est pas si simple ! (Partie 1) » dans le blog Yahoo

Mis à jour 12/04/2015 à 21h36 par yahiko

Catégories
Jeux vidéos , Développement , Javascript , Développement Web

Commentaires

  1. Avatar de phpiste
    • |
    • permalink
    [CITATION]Dans une seconde partie, j'expliquerai comment interpréter du JavaScript de façon fiable.[/CITATION]
    On est en attente de cette explication
  2. Avatar de yahiko
    • |
    • permalink
    Citation Envoyé par phpiste
    [CITATION]Dans une seconde partie, j'expliquerai comment interpréter du JavaScript de façon fiable.[/CITATION]
    On est en attente de cette explication
    Elle ne devrait pas tarder à arriver ^^