Signatur
Beschreibung
Die Eigenschaft sandbox spiegelt das HTML-Attribut sandbox eines <iframe> als DOMTokenList wider. Ist das Attribut vorhanden, gelten für den eingebetteten Inhalt alle Einschränkungen: kein Skript, keine Formularübermittlung, keine Pop-ups, eine eindeutige „opake“ Herkunft (opaque origin), keine Navigation des obersten Fensters usw. Jedes Token wie allow-scripts oder allow-forms hebt gezielt eine dieser Einschränkungen auf.
Die Eigenschaft selbst ist schreibgeschützt, die Liste ist aber live: Mit add(), remove(), toggle() und replace() änderst du direkt das zugrunde liegende Attribut. Mit supports() prüfst du, ob der Browser ein bestimmtes Token kennt. Wird der Eigenschaft ein String zugewiesen, landet er (wie bei classList) über [PutForwards=value] im Attribut.
Einsatzgebiete sind vor allem das Einbetten nicht vertrauenswürdiger Inhalte: Werbung, Nutzer-HTML, Code-Spielwiesen, Vorschauen von E-Mails oder Widgets Dritter. Grundsatz: so wenige Tokens wie möglich freigeben.
Wichtig: Änderungen an den Sandbox-Tokens wirken erst bei der nächsten Navigation des iframes. Ein bereits geladenes Dokument behält seine Einschränkungen, bis src bzw. srcdoc neu geladen wird.
Rückgabewert
allow-scripts, allow-forms, allow-popups, allow-same-origin, allow-modals, allow-downloads, allow-top-navigation-by-user-activation. Ist das Attribut nicht gesetzt, ist die Liste leer (length === 0); ohne Attribut gilt aber keine Sandbox.Beispiele
Sandbox-iframe für Nutzer-HTML erzeugen
const frame = document.createElement('iframe');
// Leeres Attribut = maximale Einschränkung
frame.setAttribute('sandbox', '');
// Nur Skripte erlauben, KEIN allow-same-origin
frame.sandbox.add('allow-scripts');
frame.srcdoc = '<p>Hallo</p><script>document.body.append(" – Skript läuft")<\/script>';
document.body.append(frame);
console.log(frame.sandbox.value);
console.log(frame.getAttribute('sandbox'));
Token-Unterstützung prüfen
const frame = document.createElement('iframe');
const tokens = ['allow-downloads', 'allow-modals', 'allow-foo'];
for (const token of tokens) {
console.log(token, frame.sandbox.supports(token));
}
Rechte umschalten und iframe neu laden
const frame = document.querySelector('iframe#vorschau');
const setFormsAllowed = (erlaubt) => {
frame.sandbox.toggle('allow-forms', erlaubt);
// Änderung greift erst nach erneuter Navigation
frame.src = frame.src;
};
setFormsAllowed(true);
console.log(frame.sandbox.contains('allow-forms'));
Aktuelle Tokens auflisten
const frame = document.createElement('iframe');
frame.sandbox = 'allow-scripts allow-popups';
console.log(frame.sandbox.length);
console.log([...frame.sandbox]);
// Wichtig · Fallstricke
- Sicherheit: Die Kombination
allow-scripts+allow-same-originbei Inhalten derselben Herkunft hebelt die Sandbox aus: Das eingebettete Skript kann dassandbox-Attribut seines eigenen iframes überparententfernen und sich neu laden. Nutze diese Kombination nur für fremde Herkunft. - Leere Liste ≠ keine Sandbox: Eine leere
DOMTokenListkann „Attribut fehlt“ (keine Einschränkung) odersandbox=\"\"(volle Einschränkung) bedeuten. Prüfe mitframe.hasAttribute('sandbox'). - Verzögerte Wirkung: Änderungen gelten erst nach der nächsten Navigation des iframes.
- Die Sandbox ersetzt keine serverseitige Absicherung. Ergänzend lassen sich
Content-Security-Policy: sandbox(HTTP-Header) und das Attributallow(Permissions Policy) einsetzen. - Inhalte in einer Sandbox ohne
allow-same-originhaben eine opake Herkunft:localStorage, Cookies undpostMessagemit fester Ziel-Herkunft funktionieren anders; der Empfänger siehtevent.origin === \"null\". - Kompatibilität: In allen aktuellen Browsern unterstützt;
supports()für neuere Tokens wieallow-downloadsoderallow-top-navigation-to-custom-protocolsverwenden.