9
votes

Y a-t-il un moyen de prison en JavaScript, de sorte que le DOM n'est pas visible

J'aimerais vraiment fournir à l'utilisateur certaines capacités de script, tout en ne donnant pas accès aux fonctionnalités les plus puissantes, comme la modification du DOM. C'est-à-dire que toutes les entrées / sorties sont tunnelées à travers une interface donnée. Comme une sorte de javacsript restreint.

exemple: Si l'interface est Checkanswer (FUNC) Ceci sont autorisés: xxx

mais ceux-ci ne sont pas autorisés:

alerte (1)
document.write ("Hello World")
eval ("alerte ()")

Edit: Ce que j'avais à l'esprit était une langue simple qui a été mise en œuvre à l'aide de JavaScript, quelque chose comme http://stevehanov.ca/blog/index.php?id=92


1 commentaires

Où voulez-vous exécuter les scripts? Dans le navigateur ou sur le serveur?


8 Réponses :


0
votes

On dirait que vous devez traiter les données saisies de l'utilisateur et remplacer la marque non valide en fonction d'une liste blanche ou d'une liste blanche du contenu autorisé.


1 commentaires

Mais ce n'est pas exactement ce que je voudrais, car tout d'abord, une telle analyse pourrait être assez facilement contournée en utilisant le codage. Ce que j'avais à l'esprit était une langue simple qui a été interprétée par JavaScript.




13
votes

( edit Cette réponse concerne votre question de pré-édition. Je ne connais aucune langue de script implémentée à l'aide de JavaScript, bien que je m'attends, il y en ait. Par exemple, quelqu'un a écrit de base Pour JavaScript (utilisé pour avoir un lien, mais il est pourri). Le reste de cette réponse est donc assez académique, mais je l'ai laissé juste pour la discussion, l'illustration et même les fins de la mise en garde. En outre, je suis certainement d'accord avec Les points de Bobince < / a> - Ne faites pas cela vous-même, utilisez le travail des autres, tels que CAJA .)

Si vous autorisez tout script dans le contenu généré par l'utilisateur, soyez prêt pour le fait que vous entrez dans une course d'armes de personnes qui trouvent des trous de vos mécanismes de protection et de les exploiter, et vous répondez à ceux qui répondent à ces exploits. Je pense que j'avais probablement choué, mais vous connaissez votre communauté et vos options pour faire face à des abus. Donc, si vous êtes prêt pour cela:

En raison de la manière dont JavaScript est la résolution des symboles, il semble que cela devrait être possible d'évaluer un script dans un contexte où fenêtre , document , ActiveXObject , XMLHTTPQUEST et similaire ne pas avoir leurs significations habituelles: xxx < p> (maintenant qui utilise le mal eval , mais je ne peux pas penser immédiatement à un moyen d'ombre des objets par défaut du navigateur croiseur sans utiliser eval , et si vous " Réception du code comme texte de toute façon ...)

mais il ne fonctionne pas , ce n'est qu'une solution partielle (plus ci-dessous). La logique Il y a que toute tentative dans le code dans code de code pour accéder à la fenêtre (par exemple) accédera à la variable locale fenêtre , pas le global ; et le même pour les autres. Malheureusement, à cause de la manière dont les symboles sont résolus, toute propriété de window est accessible avec ou sans la fenêtre . préfixe ( alerte , par exemple ), vous devez donc les énumérer aussi. Cela pourrait être une liste longue, notamment car Bobince souligne, c'est-à-dire décharger n'importe quel élément DOM avec un nom ou un identifiant sur fenêtre . Donc, vous devrez probablement mettre tout cela dans sa propre iframe afin que vous puissiez faire une course de fin sur que problème et "seulement" doit faire face aux trucs standard. Notez également comment j'ai fabriqué la portée fonctionner une propriété d'un objet, puis que vous seul appelez-le via la propriété. C'est ainsi que ceci est défini sur l'instance SCOPER (sinon, sur un appel de fonction brut, Ceci par défaut sur fenêtre !).

Mais, comme le souligne Bobince, il y a juste tellement de façons différentes de devenir des choses. Par exemple, ce code dans CodeString brise la prison ci-dessus: xxx

maintenant, peut-être vous pouvez mettre à jour la prison Pour que cet exploit spécifique ne fonctionne pas (mucking avec le constructeur constructeur sur tous - tous - des objets intégrés), mais j'ai tendance à en douter. Et si vous pourrait , quelqu'un (comme Bob) viendrait simplement à proposer une nouvelle exploit, comme celui-ci: xxx

d'où la "course d'armement . "

Le seul moyen vraiment approprié de le faire serait d'avoir un analyseur JavaScript approprié intégré à votre site, d'analyser leur code et de rechercher des accès illégaux, puis laissez le code exécuter. C'est beaucoup de travail, mais si votre cas d'utilisation le justifie ...


13 commentaires

En plus, chaque objet de document avec un identifiant / nom est vidé dans la fenêtre sur IE ... amusez-vous filtrer ceux-ci!


@bobince: Blech Ouais, vous devrez probablement combiner ce qui précède avec un iframe ou quelque chose à gérer ceux-ci, alors vous "seulement" avoir à vous soucier des éléments standard, pas des éléments nommés / identifiés . (Réponse mise à jour avec cela, merci, bien qu'il semble que les utilisateurs utilisent JavaScript n'est pas tout ce qu'il voulait dire.)


Et puis il y a nouvelle fonction ('...') () pour échapper à la portée locale. Ce n'est pas bloqué car vous pouvez saisir un constructeur pour obtenir une fonction . Et arguments.caller pour script de la pile d'appels; arguments ne peut pas être écrasé. Et tripoter des prototypes d'objets utilisés ultérieurement par l'appelant. Et retourner un objet avec un saboté ou propriétés. Etc. Résumer: aaaaargh. :-)


@Bobince: Arrgh a raison. :-) Vous pouvez Shadow fonction et arguments sur chrome, firefox et c'est-à-dire. Je ne suis pas suivi de votre argument (vous pouvez obtenir une fonction a , mais comment cela vous permet-il de recevoir la fonction constructeur?). Mais je suis avec vous que c'est un lot de travail et, comme je l'ai dit au début, une course aux armements.


Si vous pouvez obtenir une fonction, vous pouvez obtenir une fonction. Donc, pour contourner l'observation: nouveau ('hello'.constructor.constructor) (' alerte ("Bonjour de global") ') . De même, ombrage arguments , il y a (fonction () {arguments.callee.caller.caller}) () ... et ainsi de suite. La course aux armements a raison!


@bobince: Oh, trop intelligent (le .Constructeur.constructor chose). (Et pour tous les doubles: je l'ai essayé et non surprenant, il est absolument juste.)


w00w qu'est-ce qu'un geek-off: D ne voulait offenser personne, c'est difficile de comprendre ce que vous parlez de


@ C0MRADE: Résumé: JavaScript est très flexible et très laid. :-)


@ C0MRADE: J'ai essayé de préciser la réponse réelle. Les commentaires ici sont définitivement un peu geek-off. :-) Et (pour moi) très précieux, merci Bob. Oui, JavaScript est très puissant, très flexible, et avec qui vient des difficultés. (Je ne suis pas d'accord avec la "laid" de Bob, mais des tomates tomahtoes ...)


Juste pour des coups de pied maintenant: auto survit scoper en tant que fenêtre référence. Et naturellement, (fonction () {renvoie ceci}) () -> fenêtre ...


@Bobince: lol tu t'amustes maintenant, n'est-ce pas? :-) Re auto , c'est juste une autre chose qui a besoin d'ombrage. Tandis que (fonction () {renvoie ceci;) () est juste une autre raison pour que j'ai ajouté la déclaration "... Ceci ne fonctionne pas ... "Dans la réponse. ;-)


@Miketheliar: Merci, je l'ai supprimé. Maintenant que votre représentant> = 2000, vous pouvez directement supprimer des liens pourries.


@ T.J. Merci, je suis pleinement conscient de mes privilèges d'édition. J'essaie de laisser les gens avoir une chance de le réparer eux-mêmes - peut-être qu'ils connaissent un miroir ou quelque chose du genre. Si vous n'aviez pas répondu, j'aurais suivi :)



0
votes

Vous pouvez le faire de la même manière que Facebook l'a fait. Ils préproduisent toutes les sources JavaScript, ajoutant un préfixe à tous les noms autres que leurs propres API d'emballage ».


0 commentaires

3
votes

Pas vraiment. JavaScript est une langue extrêmement dynamique avec de nombreuses fonctionnalités cachées ou spécifiques au navigateur pouvant être utilisées pour sortir de tout type de prison que vous pouvez concevoir.

N'essayez pas de prendre cela sur vous-même. Envisagez d'utiliser un projet existant «Mini-JS-Lonning-language» tel que CAJA .


1 commentaires

Si le sable du bac à sable doit être vraiment sécurisé, c'est probablement le seul moyen intéressant.




0
votes

Qu'en est-il de ce modèle afin de mettre en œuvre un bac à sable? xxx

qui retourne: xxx

pouvez-vous fournir un exploit approprié attaquer cette solution? Juste pour comprendre et améliorer mes connaissances, bien sûr :)

merci!


1 commentaires

Avez-vous vu la réponse sélectionnée, il a de nombreux exploits qui obtiendront l'objet global.



0
votes

Ceci est maintenant facilement possible avec des iframes Sandboxed:

var codeFunction = function(x, y) {
    alert("Malicious code!");
    return x + y;
}

var iframe = document.createElement("iframe");
iframe.sandbox = "allow-scripts";
iframe.style.display = "none";
iframe.src = `data:text/html,
<script>
    var customFunction = ${codeFunction.toString()};
    window.onmessage = function(e) {
        parent.postMessage(customFunction(e.data.x, e.data.y), '*'); // Get arguments from input object
    }
</script>`;
document.body.appendChild(iframe);
iframe.onload = function() {
    iframe.contentWindow.postMessage({ // Input object
        x: 5,
        y: 6
    }, "*");
}
window.onmessage = function(e) {
    console.log(e.data); // 11
    document.body.removeChild(iframe);
}


0 commentaires