Ich muss von Benutzern eingereichte Skripts auf meiner Website (etwa wie jsfiddle) dienen. Ich möchte, dass die Skripts auf den Browsern von Besuchern auf sichere Weise ausgeführt werden, isoliert von der Seite, auf der sie geschaltet werden. Da der Code von Benutzern übermittelt wird, kann nicht garantiert werden, dass er vertrauenswürdig ist.Wie kann ich nicht vertrauenswürdigen JavaScript-Inhalt, der von Benutzern eingegeben wurde, in Sandbox verschieben?
Im Moment kann ich von drei Möglichkeiten denken:
- Diene dem Benutzer übermittelten Inhalte in einem iframe aus einer anderen Domäne, und verlassen sich auf die Same Origin Policy. Dies würde erfordern, eine zusätzliche Domäne einzurichten, die ich möglichst vermeiden möchte. Ich glaube, so macht es jsfiddle. Das Skript kann immer noch etwas Schaden anrichten, zum Beispiel
top.location.href
, was weniger als ideal ist. http://jsfiddle.net/PzkUw/ - Verwenden Sie die sandbox attribute. Ich vermute, dass dies in den Browsern nicht gut unterstützt wird.
- Sanitize die Skripte vor dem Servieren von ihnen. Ich würde lieber nicht dorthin gehen.
Gibt es andere Lösungen oder Empfehlungen zu den oben genannten?
aktualisieren
Wenn, wie ich vermute, die erste Option ist die beste Lösung, was kann ein schädliches Skript tun andere als die obere Fensterposition zu ändern, und wie kann ich das verhindern? Ich kann bestimmte Skripte basierend auf statischer Code-Analyse manipulieren oder ablehnen, aber dies ist hard gegeben die Anzahl der Möglichkeiten, auf die Objekte zugegriffen werden können und die Schwierigkeit, statisches Javaskript im Allgemeinen zu analysieren. Zumindest würde es einen vollwertigen Parser und eine Reihe von komplexen Regeln erfordern (einige, aber ich vermute nicht alle, die in JSLint vorhanden sind).
Ich denke, Ihre Sub-Domain-Idee ist am besten. Ich habe diese Frage selbst untersucht und konnte keine bessere Lösung finden. Ich spielte einmal mit dem Laden der Skripte dynamisch über XmlHttpRequest und Ausführen von eval - ich weiß nicht, warum ich es fallen gelassen, obwohl. –
In Verbindung stehend: http://stackoverflow.com/questions/958997/frame-buster-buster-buster-code-needed – Petah
Ich stimme @JeremyJStarcher zu. Unabhängig davon, haben Sie die Möglichkeit, bestimmte JS-Elemente zu kontrollieren, wobei ** window ** am wichtigsten ist? Wenn ja, würde ich versuchen, bestimmte Anfragen aus dem iframe abzulehnen, aber ich bin mir nicht sicher, wie einfach das wäre. – inhan