Sandbox Javascript?

Est-il possible de sauvegarder des fichiers par sandbox en remplaçant diverses fonctions telles que l' alert , la window.location , l' window.location et l' eval ?

Je ne cherche pas une solution parfaite. Je suis sûr que certaines personnes trouveraient toujours un moyen de réorganiser les divs pour expliquer des mots préjudiciables ou quelque chose de malveillant, mais si je pouvais désactiver la redirection de page 100% de manière fiable, je serais le plus heureux.

J'ai essayé dans Chrome, et je fais quelque chose comme

 context={}; //use this to prevent `this` from being `window` context.f=function(){ var window=null,location=null,eval=function(){}; console.log(window); //also the other two }; context.f(); 

Semble prometteur. Si je remplace la ligne de la console avec le code envoyé par l'utilisateur (en vérifiant l'équilibrage paren), serait-ce une idée absurdement mauvaise ou une mauvaise idée? Sur Chrome, je peux encore casser les choses en passant par this à Function et à redéfinir les choses, mais cela serait acceptable pour moi.

Vous pouvez utiliser Microsoft Web Sandbox ou Google Caja .

Voici deux autres solutions possibles (disclaimer: je viens de commencer à chercher cela moi-même, donc je ne suis pas un expert).

Ceci est très intéressant, utilise les web-workers dans le code sans fil Sandbox:

https://github.com/eligrey/jsandbox

Même si, je me demande si cela se maintient davantage, ou si l'attribut iframe html5 "sandbox" suivant l'annule:

http://www.w3schools.com/html5/att_iframe_sandbox.asp

Vm.js est une machine virtuelle javascript implémentée dans coffeescript pur (devrait fonctionner dans des navigateurs relativement anciens) et peut être utilisée comme un bac à sable léger en cours de traitement. Il peut interrompre les boucles infinies et protéger les objets globaux des modifications.

En fonction de ce que cela doit faire, vous pouvez toujours exécuter le javascript dans un environnement libre de document, comme via Rhino, puis saisir les résultats côté serveur et nettoyer / insérer ceux-ci.

Vous pouvez également essayer AdSafe de Douglas Crockford, bien qu'il limite les possibilités de JavaScript.

Masquer les globals avec des variables locales n'est pas sécurisé en fait. Le prétraitement du code non approuvé avec des outils comme Google Caja peut aider, mais ce n'est pas nécessaire:

  • Pour un navigateur Web, il suffit d'exécuter un code dans un travailleur, il semble être assez restreint aujourd'hui . Voir la mise à jour ci-dessous

  • Pour Node.js, vous pouvez fork () dans un processus en sandbox et exécutez le code (en utilisant le module child_process).

Il y a aussi des bibliothèques pour simplifier le sandboxing, l'un de ceux créé par moi-même est emprisonné (il y a aussi une démo avec JS-Console qui exécute le code envoyé par l'utilisateur dans un bac à sable).

Mise à jour : évidemment, j'ai eu tort, le travailleur n'est pas sécurisé par lui-même, car il peut accéder à certaines choses de même origine, comme IndexedDB, par exemple. J'ai soumis une question connexe . La solution consiste en outre à mettre le travailleur dans un iframe sasndboxed, qui est également implémenté dans ma bibliothèque emprisonnée .

Utilisez l'attribut iframe "sandbox" HTML5.

J'ai fait une fonction javascript pour cela.

 function evalUnsafe(userCode) { var vars = []; var legal = {console: 'console', alert: 'alert'}; for(var b in this) { if (!(b in legal)) { vars.push(b); } } var funcs = vars.join(","); var code = "(function sandbox(" + funcs + ") {function runthis() {eval(" + JSON.stringify(userCode) + ");};var a = new runthis();})();"; eval(code); } 

Et puis vous pouvez le faire

Exemple 1:

 evalUnsafe("alert(window);"); 

Exemple 2 (à partir d'un fichier php):

 evalUnsafe(<?php echo json_encode(file_get_contents("example.js"));?>); 

Vous pouvez le télécharger à partir d'ici:

https://github.com/oyvindrestad/javascriptsandbox