Voici une idée. Et si vous utilisiez un analyseur statique (quelque chose que vous pourriez construire avec esprima, par exemple) pour déterminer quelles variables externes le code eval'd utilise, et les alias. Par "code extérieur" je veux dire les variables le code eval'd utilise mais ne déclare.Voici un exemple:
eval(safeEval(
"var x = window.theX;"
+"y = Math.random();"
+"eval('window.z = 500;');"))
où safeEval retourne la chaîne javascript modifié avec un contexte qui bloque l'accès à des variables extérieures:
";(function(y, Math, window) {"
+"var x = window.theX;"
+"y = Math.random();"
+"eval(safeEval('window.z = 500;');"
"})();"
Il y a deux choses que vous pouvez faire maintenant avec cette:
- Vous pouvez vous assurer que le code eval'd ne peut pas lire les valeurs des variables externes, ni y écrire (en passant
undefined
comme arguments de la fonction, ou ne pas passer d'arguments). Ou vous pouvez simplement lancer une exception dans les cas où les variables sont inaccessibles.
- Vous aussi faire en sorte que les variables créées par eval ne modifient pas la portée autour
- Vous pouvez permettre à eval de créer des variables dans le champ environnant en déclarant ces variables en dehors de la fermeture plutôt que comme paramètres de la fonction
- Vous pouvez permettre accès en lecture seule par copie valeurs des variables externes et les utiliser comme arguments à la fonction
- Vous pouvez autoriser l'accès en lecture-écriture à des variables spécifiques en disant safeEval de ne pas créer un alias ces noms particuliers
- Vous pouvez détecter les cas où l'eval fait not modifier une variable particulière et lui permettre d'être automatiquement exclu de l'alias (par exemple. Math dans ce cas, n'est pas modifiée)
- Vous pouvez donner le eval un contexte dans lequel exécuter, en passant dans les valeurs des arguments qui peuvent être différents que le contexte entourant
- Vous pourriez saisir les changements de contexte par aussi renvoyer les arguments de la fonction pour que vous puissiez les examiner en dehors de l'eval.
Notez que l'utilisation de eval
est un cas particulier, puisque par sa nature, il ne peut effectivement être enveloppé dans une autre fonction (ce qui est la raison pour laquelle nous devons faire eval(safeEval(...))
).
Bien sûr, faire tout ce travail peut ralentir votre code, mais il y a certainement des endroits où le coup n'aura pas d'importance. J'espère que cela aide quelqu'un. Et si quelqu'un crée une preuve de concept, j'aimerais voir un lien ici;
Je ne sais pas si cela fonctionnera pour 'eval' mais vous pouvez essayer de commutateur son contexte d'exécution (objet d'activation google). – jfs
Jetez un oeil à l'implémentation de dojox.secure.sandbox. – jfs
Maintenant, ce que vous voulez probablement est un travailleur Web. – bjb568