Muss ich '&' wirklich als '& amp;' codieren?

207

Ich verwende ein ' &' Symbol mit HTML5 und UTF-8 in meiner Site <title>. Google zeigt das kaufmännische Und auf seinen SERPs an, ebenso wie alle Browser in ihren Titeln.

http://validator.w3.org gibt mir Folgendes :

& hat keine Zeichenreferenz gestartet. (& hätte wahrscheinlich als entkommen sollen &amp;.)

Muss ich das wirklich tun &amp;?

Ich bin nicht besorgt darüber, dass meine Seiten validiert werden, um sie zu validieren, aber ich bin neugierig, die Meinungen der Leute dazu zu hören und ob es wichtig ist und warum.

Haroldo
quelle
63
Die Spezifikationen sagen dies nicht. Das Poster bezieht sich auf HTML5, bei dem nicht in allen Szenarien das kaufmännische Und-Zeichen entfernt werden muss.
Matthew Wilson
2
Dies sollte ein Community-Wiki sein, da Sie nach Meinungen suchen. Wenn Sie sich nicht um die Validierung kümmern, bedeutet dies, dass es keine objektive Grundlage gibt, auf der Sie antworten können.
Richard JP Le Guen
6
@ Richard: wirklich? Obwohl ich nicht der Meinung bin, dass "Validierung keine Rolle spielt", sehe ich dies als eine sehr objektive Frage: "Bricht dies etwas anderes als die Spezifikation?"
Joachim Sauer
2
@YiJiang Aktuelle Webbrowser sind sehr bemüht , den Benutzer zu verstehen . Und Google auch . Es ist Teil der Spezifikation. Zukünftige Webbrowser sind möglicherweise weniger verzeihend. Es ist also immer eine gute Idee, zu überprüfen, wie Wikipedia es macht, und sie zu kopieren.
Unixman83
2
Die HTML-Spezifikation besagt, dass Mist eingegeben werden soll. Bedeutet das, dass Ihre Site jetzt "Mist" sein darf? Schließen Sie Tags, die geschlossen werden müssen, und entkommen Sie Dingen! Kommt schon Leute.
Doug65536

Antworten:

143

Ja. Wie der Fehler bereits sagte, sind Attribute in HTML #PCDATA, was bedeutet, dass sie analysiert werden. Dies bedeutet, dass Sie Zeichenentitäten in den Attributen verwenden können. Die Verwendung &an sich ist falsch und wenn nicht für milde Browser und die Tatsache, dass dies HTML ist, nicht XHTML, würde das Parsen brechen. Entkomme einfach so &amp;und alles wäre in Ordnung.

Mit HTML5 können Sie es frei lassen, aber nur, wenn die folgenden Daten nicht wie eine gültige Zeichenreferenz aussehen. Es ist jedoch besser, sich allen Instanzen dieses Symbols zu entziehen, als sich Gedanken darüber zu machen, welche sein sollten und welche nicht.

Denken Sie an diesen Punkt. Wenn Sie & to & amp; nicht entkommen, ist es schlecht genug für Daten, die Sie erstellen (wobei der Code sehr wohl ungültig sein könnte), und Sie können auch nicht Tag-Begrenzer entkommen, was ein großes Problem für vom Benutzer übermittelte Daten ist. Dies könnte sehr gut zu HTML- und Skript-Injection, Cookie-Diebstahl und anderen Exploits führen.

Bitte entkommen Sie einfach Ihrem Code. Das erspart Ihnen in Zukunft viel Ärger.

Delan Azabani
quelle
9
Kein Browser wird jemals ein & für sich "falsch interpretieren". Jeder vorhandene Browser zeigt es als "&" an. In Anbetracht dessen, dass er ausdrücklich nach praktischen Gründen gefragt habe und dass er sich nicht für die Validierung interessiere.
Thomas Bonini
46
Ja. Aber moralisch, sollten wir sein , unter Berufung auf die Kronzeugenregelung und „nett“ Fehlerbehandlung von Browsern? Oder sollten wir einfach den richtigen Code schreiben?
Delan Azabani
8
@ Delan: Während ich versuche, jede Seite, die ich schreibe, validieren zu lassen, verstehe ich durch das Lesen seiner Frage, dass ihm "moralisch" egal ist. Er kümmert sich nur darum, ob es funktioniert oder nicht. Sie sind zwei verschiedene Philosophien und beide haben ihre Vor- und Nachteile, und es gibt keine "richtige". Zum Beispiel wird diese Website nicht validiert, und dennoch ist sie eine großartige Website.
Thomas Bonini
3
@Andreas, aber Browser haben genug Fehler bei der Interpretation des richtigen Codes, abhängig davon, ob sie die richtigen Ergebnisse erzielen, wenn Sie ihnen bedeutungsloses Markup senden. Es kann heute mit diesem Beispiel funktionieren und dann mit dem nächsten Beispiel fehlschlagen (sagen wir, wenn das nächste Beispiel irgendwo nach dem & ein
Jon Hanna
11
Alle scheinen über HTML5 zu sprechen, aber die ursprüngliche Frage besagt, dass HTML5 verwendet wird. HTML5 erlaubt explizit ein nicht entflohenes & in dieser Situation, es sei denn, das Folgende & würde normalerweise zu einer Entität erweitert (z. B. & copy = 2 ist problematisch, & x = 2 ist in Ordnung).
Matthew Wilson
55

Abgesehen von der Validierung bleibt die Tatsache bestehen, dass das Codieren bestimmter Zeichen für ein HTML-Dokument wichtig ist, damit es ordnungsgemäß und sicher als Webseite gerendert werden kann.

Encoding &als &amp;unter allen Umständen für mich ist eine einfachere Regel zu leben, was die Wahrscheinlichkeit von Fehlern und Störungen zu reduzieren.

Vergleichen Sie Folgendes: Was ist einfacher? was ist leichter zu nerven ?

Methodik 1

  1. Schreiben Sie Inhalte, die kaufmännisches Und enthalten.
  2. Codiere sie alle.

Methodik 2

(bitte mit einem Körnchen Salz;))

  1. Schreiben Sie Inhalte, die ein kaufmännisches Und enthalten.
  2. Sehen Sie sich von Fall zu Fall jedes kaufmännische Und an. Bestimmen Sie, ob:
    • Es ist isoliert und als solches eindeutig ein kaufmännisches Und. z.B. volt & amp
       > In diesem Fall müssen Sie es nicht verschlüsseln.
    • Es ist nicht isoliert, aber Sie glauben, dass es dennoch eindeutig ist, da die resultierende Entität nicht existiert und niemals existieren wird, da sich die Entitätsliste niemals entwickeln könnte. zB amp&volt
       > In diesem Fall stören Sie nicht die Codierung.
    • Es ist nicht isoliert und mehrdeutig. z.B. volt&amp
       > Codieren Sie es.

??

Richard JP Le Guen
quelle
3
Der zweite Fall von amp&volt ist nicht eindeutig: Ist &voltjetzt eine Entitätsreferenz oder nicht?
Gumbo
6
@Gumbo Das kaufmännische Und in amp&voltist kein mehrdeutiges kaufmännisches Und (gemäß der Definition in der HTML-Spezifikation). Siehe mathiasbynens.be/notes/ambiguous-ampersands und momeff.in/ampersands#amp%26volt .
Mathias Bynens
@MathiasBynens Inzwischen (2019) scheint sich die Definition eines mehrdeutigen kaufmännischen Und- Zeichens gegenüber der Definition, die Sie 2011 in mathiasbynens.be/notes/ambiguous-ampersands zitiert haben, etwas geändert zu haben .
Jacob C. sagt Reinstate Monica
21

HTML5-Regeln unterscheiden sich von HTML4. In HTML5 ist dies nicht erforderlich - es sei denn, das kaufmännische Und sieht so aus, als würde ein Parametername gestartet. "& copy = 2" ist beispielsweise immer noch ein Problem, da & copy; ist das Copyright-Symbol.

Es scheint mir jedoch schwieriger zu sein, je nach folgendem Text zu entscheiden, ob codiert oder nicht codiert werden soll. Der einfachste Weg ist also wahrscheinlich, die ganze Zeit zu codieren.

Matthew Wilson
quelle
2
Es ist wie das Zitieren von Attributwerten - Sie müssen nicht, aber Sie können nichts falsch machen, wenn Sie es die ganze Zeit tun.
Paul D. Waite
3
&copy=2ist kein so großes Problem, wie Sie vielleicht denken. In Attributwerten (z. B. dem hrefAttribut) wird das &copynicht als Zeichenreferenz für betrachtet ©. Außerhalb eines Attributwerts würde es.
Mathias Bynens
Angesichts der Tatsache, dass einem kaufmännischen Und normalerweise ein Leerzeichen im englischen Text vorangestellt und gefolgt wird, ist es nicht schwierig, sich an die Regel zu erinnern oder darüber nachzudenken, die ich befolge: Wenn das kaufmännische Und kein anderes sichtbares Zeichen berührt, was fast immer der Fall ist, ist dies nicht erforderlich Codierung. Ansonsten einfach der Einfachheit halber codieren.
Carl Smith
Könnten Sie einen Verweis auf die HTML5-Regeln hinzufügen?
Ferrybig
17

Ich denke, dies hat sich eher zu einer Frage entwickelt: "Warum sollte man der Spezifikation folgen, wenn es den Browsern egal ist?" Hier ist meine allgemeine Antwort:

Standards sind keine "gegenwärtige" Sache. Sie sind eine "zukünftige" Sache. Wenn wir als Entwickler Webstandards befolgen, implementieren Browseranbieter diese Standards mit größerer Wahrscheinlichkeit korrekt, und wir nähern uns einem vollständig interoperablen Web, in dem CSS-Hacks, Funktionserkennung und Browsererkennung nicht erforderlich sind. Wo wir nicht herausfinden müssen, warum unsere Layouts in einem bestimmten Browser kaputt gehen oder wie wir das umgehen können.

Insbesondere, wenn für HTML5 die Verwendung von & amp; Wenn Sie in Ihrer speziellen Situation einen HTML5-Doctype verwenden (und auch erwarten, dass Ihre Benutzer HTML5-kompatible Browser verwenden), gibt es keinen Grund, dies zu tun.

Ryan Kinal
quelle
1
Wenn dies gesagt wird, müssen Sie sich im Allgemeinen daran erinnern, dass sich die meisten "Standard" -Methoden noch im Entwurfsmodus befinden und sich in Zukunft ändern können.
Refaelio
6

Nun, wenn es von Benutzereingaben kommt, dann absolut ja, aus offensichtlichen Gründen. Überlegen Sie, ob genau diese Website dies nicht getan hat: Der Titel dieser Frage wird angezeigt, wenn ich wirklich '&' als '&' codieren muss.

Wenn es nur so etwas ist, müssen echo '<title>Dolce & Gabbana</title>';Sie es streng genommen nicht. Es wäre besser, aber wenn Sie dies nicht tun, wird kein Benutzer den Unterschied bemerken.

Thomas Bonini
quelle
5

Können Sie uns zeigen, was Sie titleeigentlich sind? Wenn ich einreiche

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

zu http://validator.w3.org/ - explizit aufgefordert, den experimentellen HTML 5-Modus zu verwenden - es gibt keine Beschwerden über die &...

AakashM
quelle
1
Ja, HTML5 hat einen anderen Parser als frühere HTML- und XHTML-Parser und erlaubt in bestimmten Situationen nicht entflohenes kaufmännisches Und.
Kevinji
In Bezug auf diese Beispiele ist dies in HTML5 nichts Neues. Beide <title>Dolce & Gabbana</title>und <p>Dolce & Gabbana</p>sind gültiges HTML 2.0.
Mathias Bynens
4

In HTML &markiert a den Beginn einer Referenz, entweder einer Zeichenreferenz oder einer Entitätsreferenz . Ab diesem Zeitpunkt erwartet der Parser entweder eine #Bezeichnung für eine Zeichenreferenz oder einen Entitätsnamen für eine Entitätsreferenz, gefolgt von a ;. Das ist das normale Verhalten.

Aber wenn der Referenzname oder nur die Referenzöffnung & durch ein Leerzeichen oder andere Trennzeichen folgen mag ", ', <, >, &, das Ende ;und auch eine Referenz eine Ebene darstellen &kann verzichtet werden:

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>

Nur in diesen Fällen kann das Ende ;oder sogar die Referenz selbst weggelassen werden (zumindest in HTML 4). Ich denke, HTML 5 erfordert das Ende ;.

In der Spezifikation wird jedoch empfohlen , immer eine Referenz wie die Zeichenreferenz &#38;oder die Entitätsreferenz &amp;zu verwenden, um Verwechslungen zu vermeiden:

Autoren sollten " &amp;" (ASCII-Dezimalzahl 38) anstelle von "" verwenden.& " verwenden, um Verwechslungen mit dem Beginn einer Zeichenreferenz (Entitätsreferenz-Trennzeichen) zu vermeiden. Autoren sollten auch " &amp;" in Attributwerten verwenden, da Zeichenreferenzen innerhalb von CDATA-Attributwerten zulässig sind.

Gumbo
quelle
1
Das ist die HTML 4-Spezifikation, auf die Sie verlinken. Nach meiner Lektüre der (Entwurfs-) HTML 5-Spezifikation sind nur mehrdeutige kaufmännische Und-Zeichen nicht zulässig. Ein kaufmännisches Und, gefolgt von einem Leerzeichen, ist beispielsweise nicht mehrdeutig und sollte daher (wiederum durch meine Lektüre) zulässig sein - siehe meine Antwort für das Markup, das der HTML 5-Validator akzeptiert.
AakashM
1
@AakashM: Ich bin nicht sicher, es klang so.
Gumbo
3

Wenn der Benutzer es an Sie weitergibt oder es in einer URL angezeigt wird, müssen Sie es maskieren.

Wenn es in statischem Text auf einer Seite erscheint? Alle Browser werden dies so oder so richtig machen, Sie machen sich keine großen Sorgen, da es funktionieren wird.

Dean J.
quelle
3

Update (März 2020): Der W3C-Validator beschwert sich nicht mehr über das Entkommen von URLs.

Ich habe überprüft, warum Bild-URLs ausgeblendet werden müssen, und habe es daher unter https://validator.w3.org versucht . Die Erklärung ist ziemlich nett. Es wird hervorgehoben, dass sogar URLs maskiert werden müssen. [PS: Ich denke, es wird sich entziehen, wenn es verbraucht wird, da die URL benötigt wird &. Kann jemand klarstellen?]

<img alt="" src="foo?bar=qut&qux=fop" />

Im Dokument wurde eine Entitätsreferenz gefunden, es ist jedoch keine Referenz mit diesem Namen definiert. Dies wird häufig durch eine falsche Schreibweise des Referenznamens, nicht codierte kaufmännische Und-Zeichen oder durch das Weglassen des nachfolgenden Semikolons (;) verursacht. Die häufigste Ursache für diesen Fehler sind nicht codierte kaufmännische Und-Zeichen in URLs, wie von der WDG unter "kaufmännisches Und in URLs" beschrieben. Entitätsreferenzen beginnen mit einem kaufmännischen Und (&) und enden mit einem Semikolon (;). Wenn Sie in Ihrem Dokument ein kaufmännisches kaufmännisches Und verwenden möchten, müssen Sie es als "&" codieren (auch innerhalb von URLs!). Achten Sie darauf, Entitätsreferenzen mit einem Semikolon zu beenden. Andernfalls wird Ihre Entitätsreferenz möglicherweise im Zusammenhang mit dem folgenden Text interpretiert. Beachten Sie auch, dass bei benannten Entitätsreferenzen zwischen Groß- und Kleinschreibung unterschieden wird. & Aelig; und æ sind verschiedene Zeichen.

Nishant
quelle
1
Lesen Sie die Antwort mit der höchsten Bewertung. Attribute sind #PCDATA und werden daher analysiert. Entitäten werden dort gehandhabt. In Ihrem Beispiel &startet der eine Entitätsreferenz. Nach dem Lesen &quxfindet der Parser kein endgültiges Semikolon ( ;), sondern stößt auf ein Gleichheitszeichen ( =), das nicht Teil des Entitätsnamens sein kann. Dies sollte ein Analysefehler sein, wenn der Parser versucht hat, wirklich streng zu sein (gemäß HTML 4). In HTML 5 ist das Parsen von Entitäten insgesamt entspannter.
Palec
1
Ich vermute, dass es ;aus diesem Grund im Allgemeinen am besten ist, Trennzeichen in Abfragezeichenfolgen zu verwenden (wenn Sie den Link steuern).
Demi
2

Ja, Sie sollten versuchen, wenn möglich gültigen Code bereitzustellen.

Die meisten Browser korrigieren diesen Fehler stillschweigend, es gibt jedoch ein Problem, wenn Sie sich auf die Fehlerbehandlung in den Browsern verlassen. Es gibt keinen Standard für den Umgang mit falschem Code. Daher muss jeder Browserhersteller versuchen, herauszufinden, was mit jedem Fehler zu tun ist. Die Ergebnisse können variieren.

Einige Beispiele, bei denen Browser wahrscheinlich anders reagieren, sind das Einfügen von Elementen in eine Tabelle, jedoch außerhalb der Tabellenzellen, oder das Verschachteln von Links ineinander.

Für Ihr spezielles Beispiel ist es unwahrscheinlich, dass Probleme auftreten. Eine Fehlerkorrektur im Browser kann jedoch beispielsweise dazu führen, dass der Browser vom standardkonformen Modus in den Mackenmodus wechselt, wodurch Ihr Layout möglicherweise vollständig ausfällt.

Sie sollten also Fehler wie diesen im Code korrigieren, wenn nicht für irgendetwas anderes, um die Fehlerliste im Validator kurz zu halten, damit Sie schwerwiegendere Probleme erkennen können.

Guffa
quelle
2

Vor ein paar Jahren haben wir den Bericht erhalten, dass eine unserer Web-Apps in Firefox nicht richtig angezeigt wurde. Es stellte sich heraus, dass die Seite ein Tag enthielt, das aussah

<div style="..." ... style="...">

Bei einem wiederholten Stilattribut kombiniert der IE beide Stile, während Firefox nur einen davon verwendet, daher das unterschiedliche Verhalten. Ich habe das Tag in geändert

<div style="...; ..." ...>

und sicher genug, es hat das Problem behoben! Die Moral der Geschichte ist, dass Browser mit gültigem HTML konsistenter umgehen als mit ungültigem HTML. Also, repariere dein verdammtes Markup schon! (Oder verwenden Sie HTML Tidy, um das Problem zu beheben.)

dan04
quelle
1

if &wird in html verwendet wird, sollten Sie es maskieren

Wenn &in Javascript-Zeichenfolgen verwendet wird, zalert('This & that'); oder document.href, müssen Sie es nicht verwenden.

Wenn Sie document.write verwenden, sollten Sie es z document.write(<p>this &amp; that</p>)

Alex
quelle
document.writesollte vermieden werden. Siehe das Warnfeld
Oriol
Guter Punkt über document.write(). Aber das Wichtigste, was Alex darüber macht, aus Skriptständen in das Dokument zu schreiben, imo. +1
Patrick M
1

Dies hängt von der Wahrscheinlichkeit ab, dass ein Semikolon in Ihrer Nähe landet &und etwas ganz anderes anzeigt.

Wenn Sie sich beispielsweise mit Eingaben von Benutzern befassen (z. B. wenn Sie den vom Benutzer bereitgestellten Betreff eines Forumsbeitrags in Ihre Titel-Tags aufnehmen), wissen Sie nie, wo sie zufällige Semikolons platzieren, und es werden möglicherweise zufällig seltsame Entitäten angezeigt. Also entkomme immer in dieser Situation.

Natürlich können Sie es für Ihr eigenes statisches HTML überspringen, aber es ist so trivial, das richtige Escape einzuschließen, dass es keinen guten Grund gibt, es zu vermeiden.

Douglas
quelle
0

Wenn Sie wirklich über den statischen Text sprechen

<title>Foo & Bar</title>

in einer Datei auf der Festplatte gespeichert und direkt von einem Server bereitgestellt, dann ja: Es muss wahrscheinlich nicht maskiert werden.

Da gibt es aber sehr heutzutage wenig HTML-Inhalt gibt, der vollständig statisch ist, füge ich den folgenden Haftungsausschluss hinzu, der davon ausgeht, dass der HTML-Inhalt aus einer anderen Quelle generiert wurde (Datenbankinhalt, Benutzereingabe, Ergebnis des Webdienstaufrufs, Ergebnis der Legacy-API ,. ..):

Wenn Sie nicht ein einfaches entkommen &, dann sind die Chancen Sie auch nicht entgehen ein &amp;oder &nbsp;oder <b>oder <script src="http://attacker.com/evil.js">oder andere ungültige Text. Das würde bedeuten, dass Sie Ihre Inhalte bestenfalls falsch anzeigen und mit größerer Wahrscheinlichkeit XSS-Angriffen ausgesetzt sind .

Mit anderen Worten: Wenn Sie bereits die anderen problematischeren Fälle überprüfen und ihnen entkommen, gibt es fast keinen Grund, den nicht völlig kaputten, aber immer noch etwas fischigen Standalone- und Ausweichmanöver zu belassen.

Joachim Sauer
quelle
2
Ich habe nicht abgelehnt, aber wenn ich raten müsste, würde ich sagen, dass Sie abgelehnt wurden, weil Ihre Antwort (obwohl sie intelligent ist) ein wenig nicht mit der Frage übereinstimmt. Er fragt nicht nach Benutzereingaben. Er hat die Kontrolle über die Charaktere und fragt im Grunde: "Wenn es tut, was ich will, ist es wirklich wichtig, die Sprachspezifikation bis zum Buchstaben zu befolgen?" Dh er weiß, dass es ein & gibt, weil er es
Matt
@ Matt: Ich verstehe, und das wäre vernünftig. Ich ging nur davon aus, dass niemand mehr vollständig statische HTML-Seiten schreibt und dass so ziemlich der gesamte Inhalt zumindest etwas dynamisch ist (normalerweise basierend auf einigen Datenbankinhalten). Vielleicht hätte diese Annahme explizit gemacht werden sollen.
Joachim Sauer
-1

Ich bin mir nicht sicher, ob dies für irgendjemanden nützlich ist ... Ich habe eine Weile dagegen gekämpft ... hier ist eine herrliche Regex, mit der Sie alle Ihre Links, Javascript und Inhalte reparieren können. Ich musste mich mit einer Menge Legacy-Inhalten auseinandersetzen, die niemand korrigieren wollte.

Fügen Sie dies zu Ihrer Render-Überschreibung auf Ihrer Masterseite oder Ihrem Steuerelement hinzu:

Bitte flamme mich nicht dafür, dass ich das an die falsche Stelle gebracht habe:

// remove the & from href="blaw?a=b&b=c" and replace with &amp; 
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);
Richard Dufour
quelle
-1

Die Verbindung hat ein ziemlich gutes Beispiel dafür , wann und warum Sie entkommen müssen &zu&amp;

https://jsfiddle.net/vh2h7usk/1/

Interessanterweise musste ich dem Charakter entkommen, um ihn in meiner Antwort hier richtig darzustellen. Wenn ich die integrierte Codebeispieloption (über das Antwortfeld) verwenden würde, kann ich einfach eingeben&amp; und es wird so angezeigt, wie es sollte. Aber wenn ich das <code></code>Element manuell verwenden würde , müsste ich entkommen, um es richtig darzustellen :)

Mathin
quelle