Gibt es eine Möglichkeit, Javascript zu sperren, so dass das DOM nicht sichtbar ist

8

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:

%Vor%

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 Ссылка

    
TiansHUo 20.04.2010, 08:39
quelle

7 Antworten

13

( 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:

%Vor%

(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:

%Vor%

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:

%Vor%

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 20.04.2010, 08:54
quelle
5

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

%Vor%

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.

Pekka 웃 20.04.2010 08:44
quelle
3

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."

    
bobince 20.04.2010 08:59
quelle
0

Klingt so, als müssten Sie die vom Benutzer eingegebenen Daten verarbeiten und das ungültige Markup basierend auf einer weißen Liste oder einer schwarzen Liste mit zulässigen Inhalten ersetzen.

    
Kieron 20.04.2010 08:42
quelle
0

Sie können es genauso machen wie Facebook. Sie verarbeiten alle JavaScript-Quellen vor und fügen allen anderen Namen als ihren eigenen Wrapper-APIs ein Präfix hinzu.

    
SK-logic 20.04.2010 08:57
quelle
0

Ich habe einen anderen Weg: Verwenden Sie Google Getriebe WorkerPool API Sehen Sie sich Ссылка

an
  

Ein 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.

    
TiansHUo 23.04.2010 03:25
quelle
0

Was ist mit diesem Muster, um eine Sandbox zu implementieren?

%Vor%

Das gibt zurück:

%Vor%

Können Sie bitte einen Exploit bereitstellen, der geeignet ist, diese Lösung anzugreifen? Nur um mein Wissen zu verstehen und zu verbessern, natürlich :)

Danke!

    
alexroat 16.07.2012 22:46
quelle