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

38

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

Sollte 'mit entkommen werden '?

Tom
quelle

Antworten:

41

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

zog
quelle
Ich erkenne, dass dies korrekt war, als dies gepostet wurde. Wenn Sie sich jedoch den Wikipedia-Artikel ansehen, scheint er &aposnun 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.
Tomhughes
24

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 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 htmlspecialcharsFunktion verwenden, um dies zu tun. Andere Sprachen können ähnliche Funktionen haben.

Update: Ich stehe auf das Apos-Problem korrigiert. Verdammt lästiger IE.

nitro2k01
quelle
Ich habe jetzt zwei widersprüchliche Antworten. Einer empfiehlt zu fliehen und der andere nicht. Was soll ich glauben?
Tom
7
Zusamenfassend. Sie können es nach eigenem Ermessen umgehen oder auch nicht. Wenn Sie dies tun, verwenden Sie &#39;nicht &apos;. Wenn Sie aus irgendeinem Grund einfache Anführungszeichen für ein HTML-Attribut verwenden title='something', müssen Sie offensichtlich alle einfachen Anführungszeichen innerhalb dieses Attributwerts maskieren.
Nitro2k01
Ihr Absatz ist das, was mir wichtig ist , meine OCD in dem Overdrive getreten , wenn ich rot botches von Text in meinem git commit wegen unescaped Apostrophe sah imgur.com/a/LN0Pu89
eballeste
6

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.

android.weasel
quelle
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 wird jedoch nie verwendet &apos;. Alle Kodierungen sind von der Form &#39;. Dies steht im Einklang mit Nitro2K01 und zeichnete den Rat, nicht zu verwenden &apos;.

jkdev
quelle
1
Obwohl in allen drei Fällen ist es nicht braucht HTML codiert werden.
MrWhite
1

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 einfügt für string:

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 ], 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 &amp;und "so davongekommen ist &quot;? Wird es diese in &amp;amp;und verwandeln &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

Chaim-Leib Halbert
quelle
-1

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.

Sonne
quelle
"Wenn Ihr Apostroph zum Inhalt gehört, entkommen Sie ihm." - Dies scheint falsch zu sein (als würde das Wort "nicht" fehlen). Wenn der Apostroph Teil des Inhalts ist, lassen Sie sich nicht entziehen - das sollte nicht nötig sein.
MrWhite
-4

Der einfachste Weg, den Job ohne die eigentliche Entität zu erledigen, ist die Verwendung von PHPs htmlentities()oder htmlspecialchars()Funktionen:

$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
  $val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'> 
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'> 
  <head>
    <meta http-equiv='Content-type' content='text/html;charset=utf-8' />
    <title>Special Characters</title>
    <style type='text/css'>
      @import 'special.css';
    </style>
  </head>
<body>
  <form method='post' action='' id='fm' name='fm'>
    <input type='text' value='$val' name='val' id='val' />
    <input type='submit' value='submit' name='sub' id='sub' />
  </form>
</body>
  <script type='text/javascript' src='special.js'></script>
</html>";
Die Kongregation
quelle
4
Ist das ein Witz?
,
@Su "Ich fürchte, es ist nicht ...
William Edwards