170 votes

Il est Possible de Sandbox JavaScript s’exécutant dans le navigateur ?

Je me demandais si il est possible de sandbox JavaScript s'exécutant dans le navigateur pour empêcher l'accès à des fonctions qui sont normalement disponibles à l'exécution de code JavaScript dans une page HTML.

Par exemple, disons que je veux fournir une API JavaScript pour la fin d'utilisateurs pour leur permettre de définir des gestionnaires d'événements pour être exécuté lors de la "événements intéressants, mais je ne veux pas que les utilisateurs d'accéder aux propriétés et fonctions de l' window objet. Suis-je capable de faire cela?

Dans le cas le plus simple, disons que je veux pour empêcher les utilisateurs appelant alert. Un couple des approches que je peux penser sont:

  • Redéfinir window.alert à l'échelle mondiale. Je ne pense pas que ce serait une approche valable, parce que d'autres l'exécution de code dans la page (c'est à dire des trucs pas créés par les utilisateurs dans leurs gestionnaires d'événements) pourriez utiliser alert.
  • Envoyer le code de gestionnaire d'événements pour le serveur. Je ne suis pas sûr que le fait d'envoyer le code pour le serveur de processus est la bonne approche, car les gestionnaires d'événements doit s'exécuter dans le contexte de la page.

Peut-être une solution où le serveur traite la fonction définie par l'utilisateur et génère ensuite un rappel pour être exécuté sur le client pourrait fonctionner? Même si cette approche fonctionne sont t-il de meilleures façons de résoudre ce problème?

55voto

Darius Bacon Points 9741

Caja de Google est un traducteur de source à source qui « permet de mettre les tiers non approuvés HTML et JavaScript inline dans votre page et être toujours sûr. »

33voto

Simon Lieschke Points 7351

Jetez un oeil à Douglas Crockford de ADsafe:

ADsafe rend-il sûr de mettre l'invité de code (par exemple en tant que tierce partie scénarisée de la publicité ou widgets) sur n'importe quelle page web. ADsafe définit un sous-ensemble de JavaScript qui est assez puissant pour permettre d'hôtes code pour effectuer des interactions de valeur, alors que dans le même temps, la prévention des logiciels malveillants ou des dommages accidentels ou de l'intrusion. Le ADsafe sous-ensemble peut être vérifiée de façon mécanique, par des outils comme JSLint, de sorte qu'aucun homme d'inspection est nécessaire de revoir invité code de sécurité. Le ADsafe sous-ensemble met également en œuvre des bonnes pratiques de codage, augmentant la probabilité que les hôtes code s'exécute correctement.

23voto

Eli Grey Points 17553

J’ai créé une bibliothèque de sandboxing appelée jsandbox qui utilise des travailleurs web au code sandbox évalué. Il a également une méthode d’entrée pour donner explicitement données code bac à sable, que sinon il ne serait pas en mesure d’obtenir.

Voici un exemple de l’API :

20voto

minitech Points 87225

Des Web workers , simple, parfait sandbox. (Fait à droite, et selon la façon intelligente le navigateur, ils ne sont même pas vulnérable à certaines DoS-type de problèmes mentionnés dans les commentaires sur le haut de réponse.)

Une mise en œuvre à l'aide de promesses:

function safeEval(untrustedCode) {
    return new Promise(function (resolve, reject) {
        var worker = new Worker('eval.js');

        worker.onmessage = function (e) {
            worker.terminate();
            resolve(e.data);
        };

        worker.onerror = function (e) {
            reject(e.message);
        };

        worker.postMessage(untrustedCode);

        setTimeout(function () {
            worker.terminate();
            reject('The worker timed out.');
        }, 1000);
    });
}

eval.js:

onmessage = function (e) {
    postMessage(eval(e.data));
};

Pas d'INTERFACE utilisateur l'accès des travailleurs (sauf pour console dans certains navigateurs), peut être résilié séparément, ne peut pas attacher de l'INTERFACE utilisateur ou de l'exécution d'un script, sont la norme, et sont aussi sûrs que le navigateur propre JavaScript mise en œuvre.

6voto

olliej Points 16255

Tous les fournisseurs de navigateur et la spécification HTML5 œuvrent à une propriété réelle sandbox pour permettre les iframes sandbox--mais il est encore limité à la granularité de l’iframe.

En général aucun degré de regex, etc. peut en toute sécurité assainir arbitraire utilisateur de javascript comme elle dégénère pour le problème de l’arrêt  :-/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X