Ich möchte dem Benutzer wirklich einige Skriptfunktionen zur Verfügung stellen, ohne ihm den Zugriff auf die leistungsstärkeren Funktionen, wie das Ändern des DOM, zu geben. Das heißt, die gesamte Eingabe / Ausgabe wird durch eine gegebene Schnittstelle getunnelt. Wie eine Art eingeschränktes Java-Script.
Beispiel:
Wenn die Schnittstelle checkanswer(func)
ist
das ist erlaubt:
aber diese sind nicht erlaubt:
alert(1)
document.write("hello world")
eval("alert()")
EDIT: Was ich im Sinn hatte, war eine einfache Sprache, die mit Javascript implementiert wurde, so etwas wie Ссылка
( Bearbeiten Diese Antwort bezieht sich auf Ihre Frage vor der Bearbeitung. Ich kenne keine Skriptsprachen, die mit Javascript implementiert wurden, obwohl ich davon ausgehe. Zum Beispiel schrieb irgendwann jemand BASIC für Javascript (verwendet, um einen Link zu haben, aber es verfault). Der Rest dieser Antwort ist daher ziemlich akademisch, aber ich habe es nur zur Diskussion, Illustration und sogar warnenden Zwecken verlassen. Auch stimme ich definitiv bobince's Punkte - tu das nicht selbst, nimm die Arbeit anderer, wie Caja .)
Wenn Sie Scripting in benutzergenerierten Inhalten erlauben, seien Sie bereit für die Tatsache, dass Sie in ein Wettrüsten von Leuten eintreten, die Lücken in Ihren Schutzmechanismen finden und diese ausnutzen, und Sie auf diese Exploits reagieren. Ich denke, ich würde wahrscheinlich davor zurückschrecken, aber Sie kennen Ihre Gemeinschaft und Ihre Möglichkeiten, mit Missbrauch umzugehen. Also, wenn Sie darauf vorbereitet sind:
Aufgrund der Art und Weise, wie Javascript die Symbolauflösung durchführt, scheint es möglich zu sein, ein Skript in einem Kontext auszuwerten, in dem window
, document
, ActiveXObject
, XMLHttpRequest
und ähnliche nicht vorhanden sind ihre üblichen Bedeutungen:
(Nun, da das böse eval
verwendet wird, kann ich mir nicht sofort eine Methode vorstellen, die Standardobjekte browserübergreifend zu spiegeln, ohne eval
zu verwenden, und wenn Sie den Code trotzdem als Text erhalten. .)
Aber es funktioniert nicht , es ist nur eine Teillösung (mehr unten). Die Logik dort ist, dass jeder Versuch innerhalb des Codes in codeString
auf window
(zum Beispiel) auf die lokale Variable window
zuzugreifen, nicht auf die globale; und das gleiche für die anderen. Aufgrund der Art, wie Symbole aufgelöst werden, kann leider auf jede Eigenschaft von window
mit oder ohne das window.
Präfix (zB alert
) zugegriffen werden, so dass Sie diese ebenfalls auflisten müssen. Dies könnte eine lange Liste sein, nicht zuletzt weil bobince darauf hinweist, dass IE ein beliebiges DOM-Element mit einem Namen oder einer ID ablegt auf window
. Sie müssten wahrscheinlich alles in einen eigenen iFrame setzen, damit Sie das Problem umgehen und "nur" mit dem Standardkram umgehen müssen. Beachten Sie auch, wie ich die Funktion scope
zu einer Eigenschaft eines Objekts gemacht habe, und Sie dann nur über die Eigenschaft aufrufen. Das heißt, dass this
auf die Instanz Scoper
gesetzt wird (andernfalls wird this
standardmäßig auf einen rohen Funktionsaufruf auf window
gesetzt!).
Aber, wie Bobince darauf hinweist, gibt es nur so viele verschiedene Möglichkeiten, an Dinge heranzukommen. Zum Beispiel, dieser Code in codeString
bricht erfolgreich das obige Gefängnis:
Nun, vielleicht könntest du das Jail aktualisieren, damit dieser bestimmte Exploit nicht funktioniert (herumfummeln mit den constructor
Eigenschaften auf allen - all - der gebauten in Objekten), aber ich bezweifle es. Und wenn Sie könnten , würde jemand (wie Bob) gerade einen neuen Exploit entwickeln, wie diesen:
Daher das "Wettrüsten".
Der einzige wirklich gründliche Weg, dies zu tun, wäre, einen korrekten Javascript-Parser in Ihre Site einbauen zu lassen, ihren Code zu analysieren und nach illegalen Zugriffen zu suchen und erst dann den Code laufen zu lassen. Es ist eine Menge Arbeit, aber wenn dein Anwendungsfall es rechtfertigt ...
T.J. Crowder macht einen ausgezeichneten Punkt über das "Wettrüsten". Es wird sehr schwierig sein, eine wasserdichte Sandbox zu bauen.
es ist jedoch möglich, bestimmte Funktionen leicht zu überschreiben.
Einfache Funktionen:
Und nach diese Frage , sogar Dinge wie document.write
zu überschreiben ist so einfach wie
Wenn das in den Browsern funktioniert, die Sie unterstützen müssen (ich nehme an, es funktioniert in allen), ist das vielleicht die beste Lösung.
Alternative Optionen:
Sandboxing des Skripts in einen IFrame in einer anderen Subdomäne. Es wäre möglich, sein eigenes DOM zu manipulieren und alert () s und ähnliches zu senden, aber die umgebende Site würde unberührt bleiben. Möglicherweise müssen Sie dies trotzdem tun, egal welche Methode Sie wählen
Analysieren des Benutzercodes mithilfe einer weißen Liste zulässiger Funktionen. Das ist auch sehr aufwändig, weil es so viele Notationen und Variationen gibt, auf die man achten muss.
Es gibt mehrere Methoden, um das DOM auf Änderungen zu überwachen, und ich bin mir ziemlich sicher, dass es möglich ist, einen Mechanismus zu erstellen, der alle Änderungen sofort wieder rückgängig macht, ähnlich der Windows-DLL-Verwaltung. Aber es wird furchtbar komplex zu bauen und sehr ressourcenintensiv.
Nicht wirklich. JavaScript ist eine äußerst dynamische Sprache mit vielen versteckten oder browserspezifischen Funktionen, mit denen Sie aus jeder Art von Knast, die Sie entwickeln können, ausbrechen können.
Versuchen Sie nicht, dies selbst zu übernehmen. Erwägen Sie, ein existierendes Projekt wie " Caja zu verwenden."
Ich habe einen anderen Weg: Verwenden Sie Google Getriebe WorkerPool API Sehen Sie sich Ссылка
anEin erstellter Arbeiter hat keinen Zugriff zum DOM; Objekte wie Dokument und Fenster existieren nur auf der Hauptseite. Dies ist eine Konsequenz der Arbeiter nicht Freigeben eines Ausführungsstatus. Jedoch, Arbeiter haben Zugang zu allem JavaScript-integrierte Funktionen. Die meisten Gears Methoden können auch verwendet werden, durch eine globale Variable, die ist automatisch definiert: google.gears.factory. (Eine Ausnahme ist der LocalServer File Submitter, das erfordert das DOM.) Für andere Funktionalität, können geschaffene Arbeiter fragen die Hauptseite, um Anfragen auszuführen.
Tags und Links javascript dom scripting restriction