HTML-Entities Kodieren und Dekodieren
Kodieren Sie Text in sichere HTML-Entities oder dekodieren Sie sie, sofort — kostenloses Tool für Entwickler.
Ihr Text bleibt auf Ihrem Gerät
Nichts, das später zu löschen wäre
Sicher für echte Nutzerdaten
Läuft in jedem modernen Browser
So funktioniert es
- 1
Fügen Sie Ihren Text ein
Eine Zeichenkette mit spitzen Klammern, Und-Zeichen, Anführungszeichen oder Umlauten, die in Markup soll.
- 2
Wählen Sie den Kontext
Textinhalt, Attributwert oder vollständige Kodierung — jeder maskiert eine andere Menge von Zeichen.
- 3
Kopieren Sie das Ergebnis
Fügen Sie es in eine Vorlage, ein XML-Dokument, einen Feed oder einen E-Mail-Text ein.
Warum dieses Tool
Der Kontext ist eine Wahl, keine Vermutung
Für Text, für einen Attributwert und für eine URL zu maskieren sind drei verschiedene Aufgaben, und Sie wählen welche.
Doppelte Kodierung wird erkannt
Eine Eingabe, die bereits Entitäten enthält, wird markiert, damit aus einem Und-Zeichen nicht zweimal eine Entität wird.
Benannte oder numerische Ausgabe
Numerische Referenzen funktionieren in XML, in Feeds und in SVG, wo die meisten benannten Entitäten schlicht undefiniert sind.
Verlustfreies Hin und Zurück
Benannte und numerische Formen werden erkannt, samt hexadezimaler Schreibweise und Entitäten ohne Semikolon.
Ehrlich darüber, was Maskieren leistet
Es macht Text sicher für einen Kontext — ein kleinerer Anspruch, als nicht vertrauenswürdiges Markup sicher zu machen.
Nichts verlässt den Browser
Der Text wird auf dieser Seite umgewandelt, Ticketinhalte und Kundennamen aus Ihren Tests bleiben also bei Ihnen.
Es gibt kein einzelnes „HTML maskieren“ — der Kontext entscheidet
Das ist der Gedanke, der den Rest des Themas verständlich macht. Ein Browser analysiert ein Dokument in mehreren verschiedenen Zuständen, und die Zeichen, die den aktuellen Zustand beenden können, sind in jedem andere. Im Textinhalt können nur `<` und `&` etwas Neues beginnen, also sind das die beiden, die maskiert werden müssen. In einem Attributwert mit doppelten Anführungszeichen ist `<` harmlos und `"` tödlich, weil das Anführungszeichen das Attribut beendet. In einem Attributwert ohne Anführungszeichen beendet ihn ein Leerzeichen, ebenso ein Tabulator, ein Zeilenumbruch, ein Backtick, ein Gleichheitszeichen und eine schließende spitze Klammer. In einem `<script>`-Block nützt HTML-Maskierung überhaupt nichts, dort brauchen Sie JavaScript-Zeichenkettenmaskierung. Deshalb erzeugt eine einzige überall angewandte `escape()`-Hilfsfunktion zugleich kaputte Ausgaben und echte Sicherheitslücken: Sie maskiert zu viel, wo die Zeichen sicher waren, und zu wenig, wo sie es nicht waren. Vor dem Kodieren einen Kontext zu wählen ist keine Feinheit — es ist die ganze Entscheidung.
Nur eine Handvoll Zeichen muss sich überhaupt ändern
Es lohnt sich zu wissen, wie kurz die Liste ist, denn das meiste Übermaskieren entsteht aus Unkenntnis darüber. Die Zeichen mit syntaktischer Bedeutung in HTML sind `<`, `>`, `&`, `"` und der Apostroph. Davon muss `&` immer maskiert werden, weil es eine Entität beginnt, und `<` immer, weil es ein Tag beginnt. `>` ist im Textinhalt eher Höflichkeit als Pflicht — ein Browser stellt ein nacktes `>` problemlos dar —, auch wenn es in den meisten Codebasen Gewohnheit ist, es zu maskieren, weil es nichts kostet und hilft, sobald das Markup später von etwas Strengerem verarbeitet wird. Die beiden Anführungszeichen zählen nur in Attributwerten, und dort nur jenes, das Sie als Begrenzer verwendet haben. Alles andere, jeder Umlaut, jedes arabische oder chinesische Zeichen, jedes Emoji, braucht in einem UTF-8-Dokument überhaupt keine Maskierung: Die Kodierung erledigt das bereits. Aus `café` ein `café` zu machen ist erlaubt und fast immer sinnlos; es vergrößert die Datei und erschwert die Suche.
Umlaute, ß und das große ẞ, das keine benannte Entität hat
Deutschsprachige Projekte tragen ein Erbe mit sich, das eigene Erwähnung verdient. Ältere Systeme — Redaktionssysteme, Exportwerkzeuge, E-Mail-Vorlagen aus der Zeit, als ISO-8859-1 die Voreinstellung war — wandelten ä, ö, ü und ß in benannte Entitäten um, sodass „Grüße“ in der Datenbank als `Grüße` landete. Das war sinnvoll, solange man sich auf den Kodierungs-Header nicht verlassen konnte. Heute ist es ein Nettoverlust: Die Suche findet „Grüße“ nicht mehr, weil gespeichert etwas anderes steht; die Sortierung bricht, weil nach dem `&` sortiert wird; die Zeichenzählung eines längenbegrenzten Feldes lügt, weil ein Buchstabe acht Zeichen belegt; und ein Screenreader kann nicht aussprechen, was noch nicht dekodiert ist. Dazu kommt eine Besonderheit, die es nur im Deutschen gibt: Für das große ẞ, U+1E9E, existiert keine benannte Entität — die naheliegende Vermutung `&Szlig;` ist schlicht nicht definiert und in XML sogar ein fataler Fehler. Wer den Buchstaben braucht, muss `ẞ` schreiben oder ihn einfach als Zeichen setzen. Letzteres ist die richtige Antwort, zusammen mit `<meta charset="utf-8">`. Die vollständige Kodierung gibt es hier als Option für Altsysteme, die Sie dazu zwingen, nicht als Voreinstellung.
Doppelte Kodierung ist der Fehler, wegen dem dieses Werkzeug existiert
Maskieren ist nicht idempotent, und das zu vergessen erzeugt einen der bekanntesten Mängel im Web. Kodieren Sie `&` einmal, erhalten Sie `&`. Kodieren Sie das Ergebnis erneut, erhalten Sie `&amp;`, was auf der Seite als der wörtliche Text `&` erscheint. Sie haben es gesehen: Seitentitel, die „Tom & Jerry“ lesen, E-Mail-Betreffzeilen mit `'` mitten in einem Wort, Produktnamen, die in Suchergebnissen von `"` umgeben sind. Es passiert, weil Maskierung auf zwei Ebenen angewandt wurde, die nichts voneinander wussten — eine Template-Engine, die automatisch maskiert, plus ein Controller, der vorsichtshalber maskierte, bevor er die Zeichenkette weiterreichte. Die Lösung ist, niemals zweimal zu maskieren, und der Weg zur Sicherheit ist, genau einmal zu maskieren, im letztmöglichen Moment, an der Stelle, an der die Zeichenkette ins Markup eintritt. Alles, was maskiert in einer Datenbank liegt, wird irgendwann von dem, was es darstellt, erneut maskiert.
Benannte Entitäten sind eine Eigenschaft von HTML, nicht von Text
HTML5 definiert über zweitausend benannte Entitäten, von den vertrauten ` ` und `©` bis zu Dingen wie `⨂`. XML definiert genau fünf: `<`, `>`, `&`, `"` und `'`. Diese Lücke verursacht ein bestimmtes und häufiges Versagen. Setzen Sie ` ` in einen RSS-Feed, eine SVG-Datei, ein XHTML-Dokument, ein Android-Layout oder eine SOAP-Nachricht, und Sie bekommen einen Parse-Fehler, weil der Parser sie nie gehört hat und eine undefinierte Entität in XML fatal ist statt bloß ignoriert. Die numerische Form ` ` funktioniert überall, da sie keine Definition braucht. Es gibt eine spiegelbildliche Falle: `'` gehört zu den fünf von XML, fehlte aber in HTML4, weshalb alte HTML-Dokumente und manche E-Mail-Programme sie als wörtlichen Text anzeigen. Wenn eine Zeichenkette zwischen Formaten wandern kann — und in einem modernen Stack tun das die meisten —, sind numerische Referenzen die sichere Schreibweise.
Maskieren ist nicht Bereinigen, und der Unterschied zählt
Diese beiden werden ständig verwechselt, und in der Verwechslung wohnen die Injection-Fehler. Maskieren nimmt Text und macht ihn sicher für einen bestimmten Kontext, sodass er dargestellt statt interpretiert wird. Bereinigen nimmt Markup, das Markup bleiben soll, und entfernt die gefährlichen Teile daraus. Einen Kommentar vor der Ausgabe zu maskieren ist richtig; ein Rich-Text-Feld zu maskieren, das die Nutzerin formatieren darf, zerstört die Formatierung — und die übliche Reaktion, das HTML unmaskiert durchzulassen, ist das, was das Loch tatsächlich öffnet. Das schärfste Beispiel für den Unterschied ist eine URL: Kodieren Sie einen Link mit Entitäten, und `javascript:alert(1)` überlebt vollkommen unversehrt, denn die Entitätsdekodierung geschieht, bevor das URL-Schema geprüft wird, sodass aus `javascript:` wieder `javascript:` wird und ausgeführt wird. Keine Menge HTML-Maskierung schützt ein `href`; nur die Prüfung des Schemas tut das. Maskieren löst genau ein Problem, und zu wissen welches, ist der springende Punkt.
Häufige Fehler, die Sie vermeiden sollten
- Überall eine einzige Maskierfunktion verwenden. Textinhalt, Attributwerte und Skriptblöcke enden an verschiedenen Zeichen, eine einzige Hilfsfunktion maskiert also hier zu viel und dort zu wenig.
- Dieselbe Zeichenkette zweimal maskieren. Maskieren ist nicht idempotent — aus `&` wird `&` und dann `&amp;`, weshalb Seitentitel „Tom & Jerry“ lesen.
- Umlaute und ß als Entitäten in der Datenbank speichern. Das zerstört Suche und Sortierung; richtig ist `<meta charset="utf-8">` und die Buchstaben so zu schreiben, wie sie sind.
- Für das große ẞ eine benannte Entität erwarten. `&Szlig;` ist nicht definiert und in XML sogar fatal — die numerische Form `ẞ` oder das Zeichen selbst funktioniert.
- Darauf vertrauen, dass Entitätskodierung eine URL sicher macht. Entitäten werden vor der Schema-Prüfung dekodiert, aus `javascript:` wird also `javascript:` und läuft.
Im Vergleich
| Aspekt | Dieses Werkzeug | Online-Kodierer | Eine Sprachbibliothek |
|---|---|---|---|
| Text an einen Server gesendet | Nie | Meistens ja | Nein |
| Lässt Sie den Kontext wählen | Ja | Selten | Meistens |
| Warnt vor doppelter Kodierung | Ja | Nein | Nein |
| Numerische Ausgabe für XML | Ja | Manchmal | Konfigurierbar |
| Dekodiert den vollen HTML5-Satz | Ja | Teilweise | Meistens |
| Preis | Kostenlos | Kostenlos / kostenpflichtige Stufen | Kostenlos |
Funktionen
Kodieren und dekodieren
Beide Richtungen, damit Sie ebenso leicht prüfen können, was ein System erzeugt hat, wie vorbereiten, was Sie senden.
Minimale oder vollständige Kodierung
Maskieren Sie nur die vom Kontext geforderten Zeichen oder jedes Zeichen außerhalb von ASCII — je nach Ziel.
Benannte Entitäten unterstützt
Beim Dekodieren wird der vollständige benannte HTML5-Satz erkannt, samt des langen Endes, das kaum jemand tippt.
Hexadezimal und dezimal
Numerische Referenzen werden in beiden Schreibweisen gelesen und geschrieben, denn echte Dokumente enthalten beide.
Erkennung doppelter Kodierung
Bereits vorhandene Entitäten in der Eingabe werden hervorgehoben, bevor Sie sie ein zweites Mal kodieren.
Große Eingaben möglich
Eine ganze Vorlage oder ein langer Export wird ohne Upload und ohne Größenobergrenze umgewandelt.
Nichts zu installieren
Kein Build-Werkzeug, keine Laufzeitumgebung, keine Abhängigkeiten — es läuft in der Webseite.
Bereit für Arabisch und RTL
Die vollständige Oberfläche in acht Sprachen, einschließlich Arabisch von rechts nach links.
Standardmäßig sicher
Über HTTPS ausgeliefert, ohne Inhaltsverfolgung und ohne Upload an Dritte.
Wer es nutzt
Webentwicklung
Prüfen, wie sich eine Zeichenkette verhält, sobald sie in einem Attributwert steht.
E-Mail-Entwicklung
Betreffzeilen und Nachrichtentexte für streng parsende Programme vorbereiten.
Technische Redaktion
Codebeispiele auf einer Seite zeigen, ohne dass der Browser sie auszuführen versucht.
Wer kaputten Text sucht
Eine Zeichenkette dekodieren, die mit `&amp;` mittendrin angekommen ist.
Häufig Gestellte Fragen
Nein. Alles läuft lokal im Browser — Ihr Text wird nie hochgeladen, gespeichert oder geteilt.
Ja — komplett kostenlos, ohne Konto und ohne Limits.