Sie können dies mit Arbeitnehmern tun. Das Beste an Arbeitern ist, dass sie in einem anderen Prozess ausgeführt werden. Wenn also dieser Benutzercode in eine Unendlichkeitsschleife gerät, hängt die Seite nicht. Die einzige Schnittstelle mit dem Arbeiter ist eine Nachrichtenschnittstelle, so dass nur Zeichenfolgen ausgetauscht werden, was äußerst sicher ist, aber in manchen Situationen begrenzt ist.
Da nicht alle derzeit verwendeten Browser Mitarbeiter unterstützen, sind Iframes eine hilfreiche Alternative. Sie können sie in Javascript erstellen, display auf 'none' setzen, sie zum Dokument hinzufügen, die eval-Funktion aus dem iframe-contentWindow holen und dann den iframe 'zerstören', wie das Setzen von outerHTML auf '' (leere Zeichenkette). Es ist schwierig, da manchmal das Iframe-Fenster Müll sammelt, aber wenn Sie es richtig machen, haben Sie ein Eval, das ein anderes globales Objekt hat, das ein leeres Dokument enthält. Sie können dann eine Schnittstelle mit dem Code erstellen, der sie ausführt, wobei der Code global in Ihrer Seite ausgeführt wird. Die Sicherheit hängt davon ab, wie Sie diese Schnittstelle implementieren. Sie sollten Ihr globales Objekt nicht verfügbar machen, das heißt, Sie sollten die Eigenschaft 'parent' im iframe global aufheben, bevor Sie dort einen Benutzercode ausführen. Sie sollten außerdem sicherstellen, dass Sie kein Element-Objekt aus dem Seitendokument an den Code übergeben, der im globalen iframe ausgeführt wird, oder der Benutzer, der diesen Code ausführt, kann durch die parentElement-Eigenschaft im gesamten Dokument navigieren Ihre Element-Schnittstelle zum Beispiel mit Object.defineProperty. Es ist eine Menge Arbeit, es hat es einmal getan, aber es ist nicht sicher, dass es zwischen Browsern kompatibel sein wird. Zum Beispiel, wenn ich mich gut erinnere und ich keinen Fehler mache, ließ mich Chrome die Elterneigenschaft im iframe global annullieren, während ich in Safari auf einem iPad nicht konnte. Entschuldigung, ich habe momentan keinen Code, den ich mit dir teilen kann. Ich werde ihn veröffentlichen, wenn ich Zeit habe. Iframes-Skripts werden jedoch im selben Prozess wie die Seite ausgeführt, was bedeutet, dass eine Endlosschleife Ihre Seitenskripte aufhängt, und der Browser, der den Code für die Maschinenbefehle kompiliert, kann den Client os hängen (abhängig vom Browser und der os).
Drittens können Sie eine Sandbox verwenden, es gibt JavaScript-Selbstdolmetscher oder dergleichen in T.J. Crowder Kommentar Compiler, die das für Sie vereinfachen wird, aber der Nebeneffekt ist, dass es langsamer laufen wird, speziell Dolmetscher.
Ich denke, die Leute bei ECMA sollten sich weniger Sorgen über hässliche Pfeilsyntax und solche Dinge machen und eine sichere Art des Ablaufs mit verschiedenen globalen implementieren, die eine Schnittstelle ein bestimmtes Dokumentelement und seine Nachkommen aber nicht bekommen können dieses Element Eltern und Zugriff auf das Dokument. Dies wird effektiv eine Möglichkeit zum Schreiben von JavaScript-Plugins und auch sichere Werbung System ermöglichen.
Klingt wie ein Job für [Google Caja] (https://developers.google.com/caja/). –
@GeorgeStocker Ich habe meine Antwort mit der endgültigen Lösung, die ich verwende, aktualisiert. Es funktioniert im Browser, sollte auch auf Node funktionieren. – Domi
mögliches Duplikat von [Wie kann ich nicht vertrauenswürdigen Code serverseitig ausführen?] (Http://stackoverflow.com/questions/10937870/how-to-run-untrusted-code-serverside) für Node.js, http://stackoverflow.com/questions/21408343/how-to-run-javascript-in-browser-sicher und sicher für den Browser –