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 mais ceux-ci ne sont pas autorisés: 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 p> p> Checkanswer (FUNC) CODE>
Ceci sont autorisés: p>
alerte (1) code>
document.write ("Hello World") Code>
eval ("alerte ()") code>
Strike> P>
8 Réponses :
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é. P>
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.
t.j. Crowder fait un excellent point sur la "race des armes". Ça va être très em> difficile à construire une boîte à sable étanche. Il est possible de remplacer certaines fonctions, cependant, assez facilement. p> Fonctions simples: p>
( edit fort> 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 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: p> 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ù mais il ne fonctionne pas strong>, ce n'est qu'une solution partielle (plus ci-dessous). La logique Il y a que toute tentative dans le code dans Mais, comme le souligne Bobince, il y a juste tellement de façons différentes de devenir des choses. Par exemple, ce code dans maintenant, peut-être em> vous pouvez mettre à jour la prison Pour que cet exploit spécifique ne fonctionne pas (mucking avec le constructeur d'où la "course d'armement . " P> 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 ... p> p> fenêtre code>,
document code>,
ActiveXObject code>,
XMLHTTPQUEST code> et similaire ne pas avoir leurs significations habituelles: p>
eval code>, mais je ne peux pas penser immédiatement à un moyen d'ombre des objets par défaut du navigateur croiseur sans utiliser
eval code>, et si vous " Réception du code comme texte de toute façon ...) p>
code de code code> pour accéder à la fenêtre code> (par exemple) accédera à la variable locale
fenêtre code>, 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 code> est accessible avec ou sans la fenêtre
. Code> préfixe (
alerte code>, 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 code>. Donc, vous devrez probablement mettre tout cela dans sa propre iframe afin que vous puissiez faire une course de fin sur que em> problème et "seulement" doit faire face aux trucs standard. Notez également comment j'ai fabriqué la portée code> fonctionner une propriété d'un objet, puis que vous seul em> appelez-le via la propriété. C'est ainsi que
ceci code> est défini sur l'instance
SCOPER code> (sinon, sur un appel de fonction brut,
Ceci code> par défaut sur
fenêtre code >!). P>
CodeString code> brise la prison ci-dessus: p>
constructeur code> sur tous - tous em> - des objets intégrés), mais j'ai tendance à en douter. Et si vous pourrait em>, quelqu'un (comme Bob) viendrait simplement à proposer une nouvelle exploit, comme celui-ci: p>
En plus, chaque objet de document avec un identifiant / nom est vidé dans la fenêtre code> sur IE ... amusez-vous filtrer ceux-ci!
@bobince: Blech I> 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 i> tout ce qu'il voulait dire.)
Et puis il y a nouvelle fonction ('...') () code> pour échapper à la portée locale. Ce n'est pas bloqué car vous pouvez saisir un
constructeur code> pour obtenir une fonction
code>. Et
arguments.caller code> pour script de la pile d'appels;
arguments code> 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é code> ou propriétés. Etc. Résumer: aaaaargh. :-)
@Bobince: Arrgh a raison. :-) Vous pouvez Shadow fonction code> et
arguments code> sur chrome, firefox et c'est-à-dire. Je ne suis pas suivi de votre code> argument code> (vous pouvez obtenir une fonction a i>, mais comment cela vous permet-il de recevoir la fonction
code> constructeur?). Mais je suis avec vous que c'est un lot i> 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") ') code>. De même, ombrage
arguments code>, il y a
(fonction () {arguments.callee.caller.caller}) () code> ... et ainsi de suite. La course aux armements a raison!
@bobince: Oh, trop intelligent (le .Constructeur.constructor code> 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 code> survit
scoper code> en tant que fenêtre
code> référence. Et naturellement,
(fonction () {renvoie ceci}) () code> ->
fenêtre code> ...
@Bobince: lol tu t'amustes maintenant, n'est-ce pas? :-) Re auto code>, c'est juste une autre chose qui a besoin d'ombrage. Tandis que
(fonction () {renvoie ceci;) () code> est juste une autre raison pour que j'ai ajouté la déclaration "... Ceci ne fonctionne pas b> ... "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 :)
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 ». P>
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. P>
N'essayez pas de prendre cela sur vous-même. Envisagez d'utiliser un projet existant «Mini-JS-Lonning-language» tel que CAJA A >. p>
Si le sable du bac à sable doit être vraiment sécurisé, c'est probablement le seul moyen intéressant.
Qu'en est-il de ce modèle afin de mettre en œuvre un bac à sable? qui retourne: p> pouvez-vous fournir un exploit approprié attaquer cette solution? Juste pour comprendre et améliorer mes connaissances, bien sûr :) p> merci! P> p>
Avez-vous vu la réponse sélectionnée, il a de nombreux exploits qui obtiendront l'objet global.
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); }
Où voulez-vous exécuter les scripts? Dans le navigateur ou sur le serveur?