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 em> portée globale. Par exemple, supposons que nous avons du code que nous aimerions en emballant le mais Je ne peux pas arrêter le code eval code> uate (dans la console d'un navigateur):
eval code> appel,
cette fenêtre code> et
peut être masqué à partir de code> Code code>: p>
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. P> p>
3 Réponses :
Si vous utilisez des navigateurs assez modernes, vous pouvez surtout bloquer la fenêtre code> code> en faisant une fonction indiquant la fenêtre Toute tentative d'accès à la fenêtre code> ou parce que nous " Re en mode strict, les globaux implicites ne sont pas autorisés. En outre, la valeur 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. P> p> code> et
auto code> Variables avec des paramètres et exécute le code dans mode strict em>.
auto code > J'accumera simplement notre objet code> obj code> et la valeur de
ceci code> sera également notre
obj code>. p>
de la valeur code> de fonctions code> sera
non définie code> au lieu de la fenêtre
code>. P>
Il semble que vous puissiez toujours accéder aux variables globales. code = "renvoyer l'emplacement.href;"; code>,
code = "console de retour;"; code> 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 code> 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 code> 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) code> révèle que
["fenêtre", "auto" "," TOP "," parent "] code> devrait être masqué
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 */
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. P>
Désolé, anglais n'est pas ma première langue, et je suis nouveau inscrit sur le débordement de la pile. p>
Essayez-vous de sandbox
eval code> 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
code> 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