8
votes

JavaScript - Comment masquer la portée globale du script EVAL'D

Je pense généralement à la portée globale comme un espace de noms qui peut toujours être consulté de partout. J'aimerais savoir s'il est théoriquement possible de masquer complètement portée globale. Par exemple, supposons que nous avons du code que nous aimerions eval uate (dans la console d'un navigateur): xxx

en emballant le eval appel, cette fenêtre et peut être masqué à partir de Code : xxx

mais Je ne peux pas arrêter le code implicitement créer des variables globales. Est-ce possible en quelque sorte? Je ne veux pas utiliser ce genre de choses, je suis juste curieux.


7 commentaires

Essayez-vous de sandbox eval d / code arbitraire? Il y a une meilleure façon de courir si c'est votre objectif.


Non, je pensais juste à blinder la portée mondiale du code de l'utilisateur. Cela m'a conduit à cette question, c'est à propos de la théorie.


Ensuite, dans les navigateurs modernes, théoriquement, vous pourriez Freeze la fenêtre objet. Bien que je n'ai jamais essayé ça.


@ Fabríciomatté Intéressant. Je viens d'essayer de geler et de sceller dans Safari 5.1.9, et cela a fonctionné sur des objets généraux, mais n'a pas fonctionné sur l'objet global.


@ Fabríciomatté Comment feriez-vous le bac à sable d'évaluation?


@Zorgatone exécutant un code non approuvé arbitraire est une entreprise difficile, je ferais tout pour l'éviter. Mais si vous avez vraiment, ces ressources peuvent être utiles: vm.Runinnewcontext () < / code> (nœud.js uniquement), AETher (a une boîte à sable incomplète, idéalement à l'intérieur Un travailleur Web), et Dr. SES (sécurité basée sur la capacité).


Bon de savoir. Merci


3 Réponses :


6
votes

Si vous utilisez des navigateurs assez modernes, vous pouvez surtout bloquer la fenêtre en faisant une fonction indiquant la fenêtre et auto Variables avec des paramètres et exécute le code dans mode strict . xxx

Toute tentative d'accès à la fenêtre ou auto J'accumera simplement notre objet obj et la valeur de ceci sera également notre obj .

parce que nous " Re en mode strict, les globaux implicites ne sont pas autorisés. En outre, la valeur de la valeur de fonctions sera non définie au lieu de la fenêtre .

Je pense qu'il y a quelques hacks Cela peut se déplacer autour de cela, mais cela devrait couvrir la plupart des scénarios.


7 commentaires

Il semble que vous puissiez toujours accéder aux variables globales. code = "renvoyer l'emplacement.href;"; , code = "console de retour;"; et code = "Retour haut;"; Tous les résultats retournés.


@ jongo45: Oui, vous pouvez accéder aux globaux, car ils sont globaux. Mais vous ne pouvez pas faire de manipulations à la portée globale. Je suis à peu près sûr que OP essayait d'empêcher la création de nouveaux globaux, ne pas bloquer l'accès à tous.


@squint: pas vrai, top.myfunc = "123"; Vous permet de faire la console.log (myfunc) une fois que le code a été exécuté. Il devrait iTER toutes les variables globales et leur faire des arguments avant d'appeler le code.


@RAHLY: Alors haut doit être ajouté aux paramètres de fonction. Mais encore une fois, vous n'avez besoin que de bloquer tous les globaux si l'OP essayait réellement d'empêcher tout accès. Je suis à peu près sûr que OP essayait d'empêcher la création de nouveaux globaux, ne pas bloquer l'accès à tous.


Correct, mais votre déclaration était inexacte, sur la base du code posté. Je voulais juste le signaler


@RAHLY: Oui, Top doit en effet être ajouté à la liste des paramètres. Vous pouvez le faire si vous le souhaitez. C'est un cw. ;-)


Exécuter objet.keys (fenêtre) .Filter (k => fenêtre [k] instance de fenêtre) révèle que ["fenêtre", "auto" "," TOP "," parent "] devrait être masqué



5
votes

Remarque: il s'agit toujours d'un travail en cours et partiellement inspiré par l'extrait de code de Squint.

quarantinedFunction("return location.href;")();
/*
Exception: location is undefined
*/
quarantinedFunction("someGlobalVar=15;")();
/*
Exception: assignment to undeclared variable someGlobalVar
*/
quarantinedFunction("return 9*9;")();
/*
81
*/
quarantinedFunction("return console;")();
/*
undefined
*/


0 commentaires

1
votes

Vous pouvez simplement ajouter à la mendiant: "Var window = null" dans votre chaîne d'évaluation. De plus, pour chaque propriété, faites une boucle pour une boucle ajoutée à votre chaîne en début: pour (var p dans la fenêtre) youevalstring + = "var" + p + "= null;"; et mettre ceci sur une portée séparée.

Désolé, anglais n'est pas ma première langue, et je suis nouveau inscrit sur le débordement de la pile.


0 commentaires