Welche Zeichen mit ihren HTML-Entitäten maskiert werden sollen. Beispielsweise &
wird mit maskiert &
.
Sollte '
mit entkommen werden '
?
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
&apos
nun für HTML5 gültig zu sein. Das heißt, wenn Sie ältere Browser unterstützen oder HTML-E-Mails für Outlook schreiben müssen'
, halten Sie sich am besten daran, wenn Sie es für notwendig halten, dem Charakter zu entkommen.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:
Sie sollten es sich jedoch zur Gewohnheit machen, Zeichen zu entgehen, die in (X) HTML eine besondere Bedeutung haben, nämlich:
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 eigentlich ist es 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 eingibt" onclick="alert('hello');
und Sie das in einfügentitle="..."
Wenn Sie PHP verwenden, können Sie die
htmlspecialchars
Funktion verwenden, um dies zu tun. Andere Sprachen können ähnliche Funktionen haben.Update: Ich stehe auf das Apos-Problem korrigiert. Verdammt lästiger IE.
quelle
'
nicht'
. Wenn Sie aus irgendeinem Grund einfache Anführungszeichen für ein HTML-Attribut verwendentitle='something'
, müssen Sie offensichtlich alle einfachen Anführungszeichen innerhalb dieses Attributwerts maskieren.Es hängt von Ihrem Anwendungsfall ab, aber wir sollten wahrscheinlich davon abraten,
'
im Allgemeinen in natürlicher Sprache zu verwenden, sodass das Problem nicht auftreten sollte, es sei denn, Sie haben Computercode in Ihrem XML.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’
sollen'
möglichst viel ersetzen“
und”
ersetzen"
. Dies ist nützlich, da Computer lockige Interpunktion nicht als speziell erkennen. (Obwohl es mich amüsiert zu sehen, dass Stack Overflow / Chrome "don’t
" als Rechtschreibfehler betrachtet, während es mit "don't
" zufrieden ist .)Es hilft nicht , dass wir die sehr verlockend haben
'
und"
Zeichen rechts auf der Tastatur.quelle
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.
(2) Antwort von Drew: Nicht codiert.
(3) Toms Kommentar zu nitro2k01s Antwort: Kodiert.
Es geht also in beide Richtungen.
Der Quellcode dieser Seite wird jedoch nie verwendet
'
. Alle Kodierungen sind von der Form'
. Dies steht im Einklang mit Nitro2K01 und zeichnete den Rat, nicht zu verwenden'
.quelle
Wohin geht die Saite?
Ihre Antwort hängt vom Kontext ab:
Wenn Sie mit diesen Daten einen Absatz in HTML schreiben, genügt möglicherweise ein Escape-Zeichen <,> und &:
<p>{string}</p>
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 einfügt für
string
: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.
Im Extremfall sind sogar Attribute ohne Anführungszeichen gültig, sodass das Leerzeichen ebenfalls maskiert werden müsste. Und
!
,@
,$
,%
,(
,)
,=
,+
,{
,}
,[
, und]
, all das kann ein Attribut auszuzubrechen und erlaubt einen neuen einsetzen.Was ich mache
Um in JavaScript zu maskieren, verwende ich JQuery's
$(element).text(string)
oder die Maskierung$(element).attr(attrname, string)
für mich. Sei sehr vorsichtig damit$(element).html(unsafe)
, was deinem HTML 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 sich auf eine höllische Reise begeben. 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 im ersten Durchgang etwas verpasst haben, aber Ihr Fluchtweg schon
&
so&
und"
so davongekommen ist"
? Wird es diese in&amp;
und verwandeln&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
quelle
Wenn Ihr Apostroph zum Inhalt gehört, schließen Sie ihn. Alle anderen Inhaltszeichen, die mit Code verwechselt werden können, müssen ausgeblendet werden.
quelle
Der einfachste Weg, den Job ohne die eigentliche Entität zu erledigen, ist die Verwendung von PHPs
htmlentities()
oderhtmlspecialchars()
Funktionen:quelle