XSS mit innerHTML und wie Sie es verhindern
Verstehen Sie Cross-Site-Scripting und sichere Alternativen zu innerHTML
XSS mit innerHTML und wie Sie es verhindern ist eine kostenlose HTML Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des HTML Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der HTML Academy-Kurs umfasst insgesamt 4 Lektionen.
Die zentrale Schwachstelle
el.innerHTML = userInput interpretiert die Zeichenfolge als HTML. Enthält userInput <script>-Tags oder Event-Handler-Attribute (onclick, onerror), interpretiert der Browser diese und führt vom Angreifer kontrollierten Code auf der Seite aus.
Warum sie so häufig vorkommt
Jeder Code, der Benutzerdaten in HTML einfügt – etwa Server-Templates oder clientseitiges Rendering –, birgt ein XSS-Risiko, wenn die Daten nicht maskiert werden. Single-Page-Apps, die innerHTML aus API-Antworten erstellen, sind besonders gefährdet, wenn diese Antworten Benutzerinhalte enthalten.
Ein konkretes Beispiel
Ein Benutzername „Bob<img src=x onerror=alert(1)>“, der über div.innerHTML = `Welcome, ${user}` gesetzt wird, führt alert(1) aus, wenn das Bild nicht geladen werden kann. Dieselbe Nutzlast als reiner Text (über textContent) ist harmlos – der Browser sieht nur Zeichen und keine Tags.
// VULNERABLE
div.innerHTML = `Hi, ${user.name}`;
// SAFE
div.textContent = `Hi, ${user.name}`;Für reinen Text textContent verwenden
textContent setzt ausschließlich Text – HTML-Sonderzeichen erscheinen als Literalzeichen und niemals als Tags. In 90 % der Fälle ist dies das richtige Werkzeug. Wechseln Sie nur dann zu innerHTML, wenn Sie tatsächlich Markup und nicht bloß Text darstellen müssen.
Für Strukturen DOM-Methoden verwenden
Um Elemente mit Benutzerdaten zu erstellen, bauen Sie sie mit createElement und textContent auf: const li = document.createElement("li"); li.textContent = name; ul.appendChild(li);. Das Ergebnis ist strukturell identisch mit innerHTML, aber von Grund auf XSS-sicher.
Wann innerHTML verwendet werden muss
Für vom Server generiertes, vertrauenswürdiges HTML (Ihre eigene Template-Ausgabe oder bereinigten Rich Text aus einem vertrauenswürdigen Editor) ist innerHTML in Ordnung. Wenden Sie es niemals direkt auf Daten aus nicht vertrauenswürdigen Quellen an, ohne diese vorher zu bereinigen.
Rich Text mit DOMPurify bereinigen
Wenn Benutzer Rich Text übermitteln (etwa in einem Kommentar-Editor oder bei der Markdown-Darstellung), bereinigen Sie ihn vor dem Setzen von innerHTML: el.innerHTML = DOMPurify.sanitize(richHtml). DOMPurify entfernt gefährliche Tags und Attribute und erhält dabei sichere Formatierungen wie <b>, <em> und <a>.
insertAdjacentHTML birgt dasselbe Risiko
el.insertAdjacentHTML("beforeend", html) interpretiert HTML-Zeichenfolgen – mit derselben XSS-Angriffsfläche wie innerHTML. Es gelten dieselben Regeln: Übergeben Sie niemals direkt Benutzerdaten; bereinigen Sie sie oder verwenden Sie DOM-Methoden. Dasselbe gilt für document.write, obwohl das inzwischen niemand mehr verwenden sollte.
Standards der Frameworks
React, Vue, Svelte und Angular maskieren interpolierten Text standardmäßig – {name} ist sicher. Sie bieten Ausnahmen an (dangerouslySetInnerHTML in React und v-html in Vue), die dasselbe XSS-Risiko bergen; verwenden Sie sie sparsam und nur mit Bereinigung.
Attribut-Injection
Auch Attributwerte können als Angriffsvektoren dienen: <a href={url}> mit url="javascript:alert(1)" führt den Code beim Anklicken aus. Prüfen Sie URLs nach ihrem Schema (erlauben Sie nur http:, https:, mailto: und tel:), bevor Sie Benutzereingaben in href, src oder andere URL-Attribute einsetzen.
Trusted-Types-Richtlinie
Moderne Browser unterstützen Trusted Types: Konfigurieren Sie CSP mit require-trusted-types-for 'script', dann akzeptiert innerHTML keine rohen Zeichenfolgen mehr – nur von einer Policy umschlossene Werte werden zugelassen. Dadurch wird XSS durch die API statt durch Disziplin verhindert.
Mehrschichtige Verteidigung
Keine einzelne Ebene reicht aus. Kombinieren Sie serverseitige Eingabevalidierung, Ausgabe-Escaping beim Rendern, CSP zum Blockieren eingeschleuster Skripte, Trusted Types zum Zurückweisen roher Zeichenfolgen und eine Sicherheitsüberprüfung jeder Verwendung von innerHTML. Eine mehrschichtige Verteidigung übersteht einen Fehler in jeder einzelnen Ebene.
Wissensüberprüfung
Warum ist el.textContent = userInput vor XSS sicher, während el.innerHTML = userInput gefährlich ist?
Zusammenfassung
innerHTML bei Benutzereingaben ist der klassische XSS-Vektor. Verwenden Sie textContent für Text, createElement+textContent für Strukturen und DOMPurify, wenn Rich-HTML erforderlich ist. Validieren Sie URL-Schemata für Attributwerte. Ergänzen Sie CSP und Trusted Types, um Fehler zu neutralisieren, die durch das Code-Review schlüpfen. Moderne Frameworks escapen standardmäßig — verwenden Sie deren unsichere Auswege selten und prüfen Sie sie.
Häufig gestellte Fragen
Ist die Lektion „XSS mit innerHTML und wie Sie es verhindern“ kostenlos?
Ja — der vollständige Text von „XSS mit innerHTML und wie Sie es verhindern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des HTML Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der HTML Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „XSS mit innerHTML und wie Sie es verhindern“?
Verstehen Sie Cross-Site-Scripting und sichere Alternativen zu innerHTML Du übst HTML Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um HTML Academy zu starten?
Keine Vorkenntnisse erforderlich. HTML Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „XSS mit innerHTML und wie Sie es verhindern“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser HTML Academy-Lektion Code schreiben und ausführen?
Ja. Jede HTML Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Content Security Policy: meta http-equiv
- XSS mit innerHTML und wie Sie es verhindern
- iframe-Sandboxing und Permissions Policy
- HTTPS und Subresource Integrity