Hier ist eine zusätzliche Idee, die zusammen mit dem Vorschlag von Estagija ziemlich kraftvoll sein könnte (siehe die Kommentare zu seiner Antwort auf die Diskussion).
Sie könnten Dummy-Iframe erstellen und seine Function
-Funktion verwenden. Die damit erstellte Funktion hat standardmäßig nur Zugriff auf den Gültigkeitsbereich des iframes, könnte aber trotzdem aus ihr herausbrechen. Glücklicherweise ist es leicht, dies zu verhindern, wie es Eschlija vorgeschlagen hat.
Ich konnte die Funktion vorstellen, so sein:
function sandboxed(code) {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var F = frame.contentWindow.Function,
args = Object.keys(frame.contentWindow).join();
document.body.removeChild(frame);
return F(args, code)();
}
DEMO
Optional Sie 'use strict';
an den Code voranstellen möchten.
Dies funktioniert zumindest in Chrome. Ob die auf diese Weise geschaffene Funktion Zugriff auf die iframe der globalen Bereich hat oder globalen Bereich der Seite kann leicht mit getestet werden:
(function() {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
var same = window === frame.contentWindow.Function('return window;')();
alert(same ? ':(' : ':)');
document.body.removeChild(frame);
}());
Nun, könnten Sie 'window' und' document' als Parameter definieren die direkten Zugriff zu verhindern, Sie (wie Sie bereits sagten) und dann '' verwenden Sie strict '; 'auf den Code, um implizite Definition von Globals zu verhindern. Das könnte funktionieren. Es verhindert natürlich nicht den Zugriff auf existierende Globals, solange Sie diese nicht über Parameter "beschatten". Vielleicht könnte man über alle 'Fenster'-Eigenschaften iterieren und die Parameterliste automatisch erstellen. –
@FelixKling Klingt gut auf den Nennwert, ich werde ein paar Hacks versuchen, um zu sehen, ob ich immer noch Zugriff auf globale – Esailija
@FelixKling hier ist meine aktuelle, könnte funktionieren, wenn Sie 'Funktion' http://jsfiddle.net Schatten/dFmyd/ – Esailija