Welche Zeichen müssen in HTML maskiert werden?

251

Sind sie die gleichen wie XML, vielleicht plus das Leerzeichen eins (  )?

Ich habe einige große Listen mit HTML-Escape-Zeichen gefunden, aber ich glaube nicht, dass sie maskiert werden müssen . Ich will wissen , was muss maskiert werden.

Ahmet
quelle

Antworten:

318

Wenn Sie Textinhalte in Ihr Dokument an einer Stelle einfügen, an der Textinhalte erwartet werden 1 , müssen Sie normalerweise nur dieselben Zeichen wie in XML maskieren . Innerhalb eines Elements umfasst dies nur das kaufmännische Und der Entitäts-Escapezeichen &und das Elementtrennzeichen für Zeichen kleiner als und größer als < >:

& becomes &amp;
< becomes &lt;
> becomes &gt;

Innerhalb von Attributwerten müssen Sie auch das von Ihnen verwendete Anführungszeichen maskieren:

" becomes &quot;
' becomes &#39;

In einigen Fällen kann es sicher sein, das Entkommen einiger dieser Charaktere zu überspringen, aber ich empfehle Ihnen, in allen Fällen allen fünf zu entkommen, um die Wahrscheinlichkeit eines Fehlers zu verringern.

Wenn Ihre Dokumentcodierung nicht alle von Ihnen verwendeten Zeichen unterstützt, z. B. wenn Sie versuchen, Emoji in einem ASCII-codierten Dokument zu verwenden, müssen Sie diese ebenfalls umgehen. Die meisten Dokumente werden heutzutage mit der vollständig Unicode-unterstützenden UTF-8-Codierung codiert, wo dies nicht erforderlich ist.

Im Allgemeinen sollten Sie Leerzeichen nicht als entkommen &nbsp;. &nbsp;ist kein normaler Raum, es ist ein nicht brechender Raum . Sie können diese anstelle normaler Leerzeichen verwenden, um zu verhindern, dass ein Zeilenumbruch zwischen zwei Wörtern eingefügt wird, oder um zusätzliches Leerzeichen einzufügen, ohne dass es automatisch reduziert wird. Dies ist jedoch normalerweise ein seltener Fall. Tun Sie dies nur, wenn Sie eine Designbeschränkung haben, die dies erfordert.


1 Mit "einem Ort, an dem Textinhalt erwartet wird" meine ich innerhalb eines Elements oder eines angegebenen Attributwerts, an dem normale Parsing-Regeln gelten. Zum Beispiel: <p>HERE</p>oder <p title="HERE">...</p>. Was ich oben geschrieben habe, gilt nicht für Inhalte mit speziellen Analyseregeln oder -bedeutungen, z. B. innerhalb eines Skripts oder eines Style-Tags oder als Element- oder Attributname. Zum Beispiel: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script>, oder <p NOT-HERE="...">...</p>.

In diesen Kontexten sind die Regeln komplizierter und es ist viel einfacher, eine Sicherheitslücke einzuführen. Ich rate Ihnen dringend davon ab, jemals dynamische Inhalte an diesen Orten einzufügen. Ich habe Teams kompetenter sicherheitsbewusster Entwickler gesehen, die Schwachstellen eingeführt haben, indem sie davon ausgegangen sind, dass sie diese Werte korrekt codiert haben, aber keinen Randfall haben. Normalerweise gibt es eine sicherere Alternative, z. B. das Einfügen des dynamischen Werts in ein Attribut und das anschließende Behandeln mit JavaScript.

Lesen Sie gegebenenfalls die XSS-Präventionsregeln des Open Web Application Security-Projekts , um einige der Bedenken zu verstehen, die Sie berücksichtigen müssen.

Jeremy Banks
quelle
2
Einige HTML-Attributwerte haben möglicherweise auch eine besondere Bedeutung (JS / CSS). So gilt dies auch nicht für diese, zum Beispiel: <p onclick="NOT-HERE">...</p>und <p style="NOT-HERE">...</p>.
Geekley
21

Es kommt auf den Kontext an. Einige mögliche Kontexte in HTML:

  • Dokumentkörper
  • innerhalb gemeinsamer Attribute
  • innerhalb von Skript-Tags
  • Inside Style Tags
  • einige mehr!

Weitere Informationen finden Sie in den Abschnitten " Warum kann ich nicht einfach nicht vertrauenswürdige Daten von HTML-Entitäten codieren? " Und " XSS-Präventionsregeln " im Cross Site Scripting Prevention Cheat Sheet von OWASP . Es ist jedoch am besten, das gesamte Dokument zu lesen.

Daxelrod
quelle
9

Grundsätzlich gibt es drei Hauptzeichen, die in Ihren HTML- und XML-Dateien immer maskiert werden sollten, damit sie nicht mit den restlichen Markups interagieren. Wie Sie wahrscheinlich erwarten, werden zwei davon die Syntax-Wrapper sein, die <sind > sind sie wie folgt aufgeführt:

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

Wir können auch das doppelte Anführungszeichen (") als" und das einfache Anführungszeichen (') als & apos verwenden

Vermeiden Sie das Einfügen dynamischer Inhalte in <script>und. <style>Diese Regeln gelten nicht für sie. Wenn Sie beispielsweise JSON in a einfügen müssen, ersetzen Sie <durch \ x3c, das Zeichen U + 2028 durch \ u2028 und U + 2029 durch \ u2029 nach der JSON-Serialisierung.)

HTML-Escape-Zeichen: Vollständige Liste: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Sie müssen also <oder & entkommen, wenn etwas folgt, das eine Zeichenreferenz beginnen könnte. Auch die Regel für kaufmännisches Und ist die einzige solche Regel für Attribute in Anführungszeichen, da das übereinstimmende Anführungszeichen das einzige ist, das eines beendet. Wenn Sie den Attributwert dort jedoch nicht beenden möchten, entfernen Sie das Anführungszeichen.

Wenn Sie zu UTF-8 wechseln, müssen Sie Ihre Datei erneut speichern:

Wenn Sie die Zeichencodierung UTF-8 für Ihre Seite verwenden, können Sie die meisten Escapezeichen vermeiden und nur mit Zeichen arbeiten. Beachten Sie jedoch, dass es nicht ausreicht, nur die Codierungsdeklaration oben auf der Seite oder auf dem Server zu ändern, um die Codierung Ihres Dokuments zu ändern. Sie müssen Ihr Dokument in dieser Codierung erneut speichern. Weitere Informationen zum Vorgehen in Ihrer Anwendung finden Sie unter Festlegen der Codierung in Web-Authoring-Anwendungen.

Unsichtbare oder mehrdeutige Zeichen:

Eine besonders nützliche Rolle für Escapezeichen ist die Darstellung von Zeichen, die in der Darstellung unsichtbar oder mehrdeutig sind.

Ein Beispiel wäre das Unicode-Zeichen U + 200F RIGHT-TO-LEFT MARK. Dieses Zeichen kann verwendet werden, um die Richtwirkung in bidirektionalem Text zu verdeutlichen (z. B. bei Verwendung der arabischen oder hebräischen Schrift). Es gibt jedoch keine grafische Form, sodass es schwierig ist zu erkennen, wo sich diese Zeichen im Text befinden. Wenn sie verloren gehen oder vergessen werden, können sie bei der späteren Bearbeitung zu unerwarteten Ergebnissen führen. Die Verwendung (oder seines numerischen Zeichenreferenzäquivalents) macht es sehr einfach, diese Zeichen zu erkennen.

Ein Beispiel für ein mehrdeutiges Zeichen ist U + 00A0 NO-BREAK SPACE. Diese Art von Leerzeichen verhindert Zeilenumbrüche, sieht jedoch wie jedes andere Leerzeichen aus, wenn es als Zeichen verwendet wird. Die Verwendung macht deutlich, wo solche Leerzeichen im Text erscheinen.

Alireza
quelle
3

Die genaue Antwort hängt vom Kontext ab. Im Allgemeinen dürfen diese Zeichen nicht vorhanden sein ( HTML 5.2 §3.2.4.2.5 ):

Textknoten und Attributwerte müssen aus Unicode-Zeichen bestehen, dürfen keine U + 0000-Zeichen enthalten, dürfen keine dauerhaft undefinierten Unicode-Zeichen (Nichtzeichen) enthalten und dürfen keine anderen Steuerzeichen als Leerzeichen enthalten. Diese Spezifikation enthält zusätzliche Einschränkungen für den genauen Wert von Textknoten und Attributwerten in Abhängigkeit von ihrem genauen Kontext.

Bei Elementen in HTML hängen die Einschränkungen des Textinhaltsmodells auch von der Art des Elements ab. Beispielsweise muss ein "<" in einem Textbereichselement nicht in HTML maskiert werden, da Textbereich ein maskierbares Rohtextelement ist.

Diese Einschränkungen sind über die Spezifikation verteilt. Beispielsweise dürfen Attributwerte ( §8.1.2.3 ) kein mehrdeutiges kaufmännisches Und enthalten und dürfen entweder (i) leer sein, (ii) in einfachen Anführungszeichen (und dürfen daher kein U + 0027 APOSTROPHE-Zeichen enthalten '), (iii) in doppelten Anführungszeichen (. darf kein U + 0022 QUOTATION MARK-Zeichen enthalten ") oder (iv) nicht zitiert - mit den folgenden Einschränkungen:

... darf keine Literalzeichen, U + 0022 QUOTATION MARK-Zeichen ("), U + 0027 APOSTROPHE-Zeichen ('), U + 003D EQUALS SIGN-Zeichen (=), U + 003C LESS-THAN SIGN-Zeichen ( <), U + 003E GRÖSSER ALS ZEICHEN-Zeichen (>) oder U + 0060 GRAVE ACCENT-Zeichen (`) und dürfen nicht die leere Zeichenfolge sein.

Andrey
quelle