it-swarm.com.de

Soll ich das Apostroph (') mit seiner HTML-Entität (# 39;) umgehen?

Welche Zeichen mit ihren HTML-Entitäten maskiert werden sollen. Beispielsweise wird & mit & maskiert.

Soll ' mit ' maskiert werden?

37
Tom

Ich habe keine Kommentarberechtigungen, oder ich hätte dies als Kommentar zu einer früheren Antwort hinterlassen.

NICHT, wiederhole ich, NICHT mit einem Apostroph in HTML umgehen

'

Dies ist keine gültige Entitätsreferenz für HTML-Zeichen. Es ist eine XML-Zeichenentitätsreferenz. Zumindest Firefox und Chrome rendern das Obige als Apostroph in einem HTML-Dokument, Internet Explorer jedoch nicht. Und es folgt dem Standard, wenn es sich weigert, dies zu tun.

Sie können ein Apostroph in HTML mit entziehen

'

Aber ich glaube nicht, dass es im Allgemeinen notwendig ist.

http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

39
drew

Ich stimme Nate nicht zu. Idealerweise sollten Sie so wenig wie möglich maskieren und UTF-8 verwenden, um Zeichen nativ auszudrücken. Dazu benötigen Sie einen Editor, der mit UTF-8 umgehen kann, sowie eine korrekte Zeichensatzdeklaration, wie zum Beispiel:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Sie sollten es sich jedoch zur Gewohnheit machen, Zeichen zu entgehen, die in (X) HTML eine besondere Bedeutung haben, nämlich:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

Dies stellt sicher, dass Sie nicht versehentlich Markups schreiben, wenn Sie diese Zeichen schreiben möchten. Dies ist besonders wichtig für Benutzereingaben, um die Sicherheit zu gewährleisten. Es ist weniger offensichtlich, aber es ist eigentlich wichtig, " zu entkommen. Wenn eine Zeichenfolge jemals in einem HTML-Attribut (title="something" usw.) endet, kann der Benutzer das Attribut beenden und sein eigenes Markup einfügen. Stellen Sie sich vor, was passiert, wenn der Benutzer " onclick="alert('hello'); eingibt und Sie dies in title="..." einfügen.

Wenn Sie PHP verwenden, können Sie dazu die Funktion htmlspecialchars verwenden. Andere Sprachen können ähnliche Funktionen haben.

pdate: Ich stehe bezüglich des Apos-Problems korrigiert da. Verdammt lästiger IE.

23
nitro2k01

Dies hängt von Ihrem Anwendungsfall ab, aber wir sollten wahrscheinlich davon abgehalten werden, ' im Allgemeinen in natürlicher Sprache zu verwenden. Daher sollte das Problem nur auftreten, wenn Sie über Computercode in Ihrem XML-Code verfügen.

Wo wir Zeichenfolgen übersetzt haben, stellen wir fest, dass einige Übersetzer die schließenden Anführungszeichen durch die geschweiften Unicode-Anführungszeichen ersetzen, die geraden Anführungszeichen jedoch als Anfangsanführungszeichen belassen, wodurch sie visuell unsymmetrisch und unprofessionell wirken.

Die Unicode-Zeichen und sollten nach Möglichkeit ' ersetzen, ebenso wie und " ersetzen sollten. Dies ist nützlich, da Computer lockige Interpunktion nicht als speziell erkennen. (Obwohl es mich amüsiert, dass Stack Overflow/Chrome "don’t" als Rechtschreibfehler ansieht, ist es mit "don't" zufrieden.)

Es hilft nicht, dass wir die verlockenden Zeichen ' und " direkt auf der Tastatur haben.

6
android.weasel

Wohin geht die Saite?

Ihre Antwort hängt vom Kontext ab:

  1. Wenn Sie mit diesen Daten einen Absatz in HTML schreiben, genügt möglicherweise ein Escape-Zeichen <,> und &:

    <p>{string}</p>

  2. Wenn Sie jedoch in ein HTML-Attribut schreiben, wie

    <a href='/some/path/{string}'>...</a>

Dann sollten Sie unbedingt dem Apostroph entkommen. Dies kann ein Angriffsvektor sein, wenn ein Angreifer dies für string eingibt:

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. Gleiches gilt für doppelte Anführungszeichen. Ich habe sogar gelesen, dass das Backtick anfällig ist, da es auch für HTML-Attribute verwendet werden könnte. Wenn Sie kein Skript zur automatischen Überprüfung der HTML-Syntax als Teil Ihrer Bereitstellungsroutinen haben, nehmen Sie an, dass eine dieser drei Methoden verwendet werden kann und für HTML-Attribute maskiert werden muss.

  2. Im Extremfall sind sogar Attribute ohne Anführungszeichen gültig, sodass das Leerzeichen ebenfalls maskiert werden müsste. Und !, @, $, %, (, ), =, +, {, }, [ und ].

Was ich mache

Um in JavaScript zu entkommen, verwende ich JQueries $(element).text(string) oder $(element).attr(attrname, string), um das Entkommen für mich zu machen. Seien Sie sehr vorsichtig mit $(element).html(unsafe), das Ihrem HTML-Code nicht entgeht!

Beim serverseitigen Code muss ich das Risiko für jeden Fall sorgfältig abwägen und die Dokumentation sorgfältig lesen. Dies hängt von der Sprache und den Bibliotheken ab, die Sie verwenden, z. B. Rails, Django, rohes PHP, Drupal usw.

Datenbanken

Wenn Sie erwägen, das Problem so früh wie möglich zu beheben, bevor es überhaupt in Ihre Datenbank aufgenommen wird, halten Sie Ihre Pferde. Wenn Sie den in Ihrer Datenbank gespeicherten Text mit HTML-Escape-Zeichen versehen, können Sie auf eine höllische Reise gehen. Was ist, wenn Sie später bestimmte HTML-Tags zulassen möchten, andere jedoch nicht, wie Kursivschrift, Fettschrift, Farben und Tabellen? Was ist, wenn Sie bei Ihrem ersten Durchgang etwas verpasst haben, Ihr Escaper jedoch bereits & als &amp; und " als &quot; entkommen ist? Verwandelt es diese in &amp;amp; und &amp;quot;?

Mein Ansatz ist es, nur SQL-Escaping für die Datenbank durchzuführen, aber alle HTML-Sonderzeichen für die spätere Verarbeitung zu belassen. Auf diese Weise kann ich mein HTML-Escape problemlos debuggen und optimieren. Das bedeutet auch, dass ich meinen eigenen SQL-Tabellen nicht vertrauen kann, wenn sie vom Benutzer bereitgestellte Zeichenfolgen haben.

Moral

Vertrauen Sie niemals benutzergesteuerten Eingaben und zitieren Sie immer Ihre HTML-Attribute!

Basierend auf: Es gibt mehr zu HTML-Escape als &, <,> und " von Ryan Grove

1

Sehen wir uns also an, ob StackExchange selbst einen Apostroph mithilfe einer HTML-Entität codiert.

Hier sind einige Beispiele aus dem Quellcode dieser Seite.

(1) Fragentitel: Kodiert.

Should I escape the Apostrophe ( &#39; ) character with its HTML entity (&amp;#39;)?

(2) Antwort von Drew: Nicht codiert.

But I don't believe it is, in general, necessary.

(3) Toms Kommentar zu nitro2k01s Antwort: Kodiert.

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?

Es geht also in beide Richtungen.

Der Quellcode dieser Seite verwendet jedoch niemals &apos;. Alle Kodierungen haben die Form &#39;. Dies steht im Einklang mit nitro2k01 und zeichnete den Rat, &apos; nicht zu verwenden.

1
jkdev