Ich schreibe Code, der automatisch HTML generiert, und ich möchte, dass er die Dinge richtig codiert.
Angenommen, ich generiere einen Link zu der folgenden URL:
http://www.google.com/search?rls=en&q=stack+overflow
Ich gehe davon aus, dass alle Attributwerte HTML-codiert sein sollten. (Bitte korrigieren Sie mich, wenn ich falsch liege.) Wenn ich also die obige URL in ein Ankertag einfüge, sollte ich das kaufmännische Und wie folgt codieren &
:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
Ist das korrekt?
Antworten:
Ja, so ist es. HTML-Entitäten werden in HTML-Attributen analysiert, und ein Streuner
&
würde eine Mehrdeutigkeit erzeugen. Deshalb sollten Sie immer schreiben und&
nicht nur&
in alle HTML-Attribute.Das heißt, nur
&
und Anführungszeichen müssen codiert werden. Wenné
Ihr Attribut Sonderzeichen enthält , müssen Sie diese nicht codieren, um den HTML-Parser zu erfüllen.Früher mussten URLs speziell mit Nicht-ASCII-Zeichen behandelt werden, z
é
. Sie mussten diese mit Prozent-Escapezeichen codieren, und in diesem Fall würde dies ergeben%C3%A9
, da sie durch RFC 1738 definiert wurden . RFC 1738 wurde jedoch durch RFC 3986 (URIs, Uniform Resource Identifiers) und RFC 3987 (IRIs, Internationalized Resource Identifiers) ersetzt, auf deren Grundlage die WhatWG ihre Arbeit basierte, um zu definieren, wie sich Browser verhalten sollen, wenn sie eine URL mit Nicht-ASCII sehen Zeichen darin seit HTML5 . Es ist daher jetzt sicher, Nicht-ASCII-Zeichen in URLs aufzunehmen, ob prozentual codiert oder nicht.quelle
é
muss noch codiert werden: stackoverflow.com/questions/2742852/unicode-characters-in-urls&
in das Tag-Attribut fälschlicherweise doppelt umgehen, anstatt es direkt zu verwenden&
.Nach den aktuellen offiziellen HTML-Empfehlungen muss das kaufmännische Und beispielsweise
&
in solchen Kontexten maskiert werden . Browser benötigen dies jedoch nicht, und die HTML5-CR schlägt vor, dies zu einer Regel zu machen , sodass spezielle Regeln für Attributwerte gelten. Aktuelle HTML5-Validatoren sind in dieser Hinsicht veraltet (siehe Fehlerbericht mit Kommentaren).Es bleibt weiterhin möglich, kaufmännisches Und in Attributwerten zu umgehen, aber abgesehen von der Validierung mit aktuellen Tools besteht keine praktische Notwendigkeit, diese in
href
Werten zu maskieren (und es besteht ein geringes Risiko, Fehler zu machen, wenn Sie anfangen, ihnen zu entkommen).quelle
application/xhtml+xml
) wird es jedoch höchstwahrscheinlich immer erfordern.&
jetzt in Ordnung sein soll, solange es " nicht mehrdeutig" ist. Eine naheliegende Möglichkeit, das kaufmännische Und mehrdeutig zu machen, besteht darin, ihm zuerst Nicht-Leerzeichen und dann ein Semikolon zu folgen. Das Ampersand ist jetzt zweideutig, und wird ein Parse - Fehler verursachen.&
nicht eindeutig ist. Daher verwenden wir es weiterhin nicht codiert in href-Attributen.Ich poste eine neue Antwort, weil ich finde, dass die Antwort von zneak nicht genügend Beispiele enthält, die HTML- und URI-Behandlung nicht als unterschiedliche Aspekte und Standards anzeigt und einige kleinere Dinge fehlen.
Sie haben zwei Standards bezüglich URLs in links (
<a href
).Der erste Standard ist RFC 1866 (HTML 2.0), wo Sie in "3.2.1. Datenzeichen" die Zeichen lesen können, die maskiert werden müssen, wenn sie als Wert für ein HTML-Attribut verwendet werden. (Attribute selbst erlauben überhaupt keine Sonderzeichen, zB
<a hr&ef="http://...
sind sie weder erlaubt noch<a hr&ef="http://...
.)Später wurde dies in den HTML 4- Standard aufgenommen. Die Zeichen, denen Sie entkommen müssen, sind:
Der andere Standard ist RFC 3986 "Generischer URI-Standard", in dem URLs behandelt werden (dies geschieht, wenn der Browser einem Link folgt, weil der Benutzer auf das HTML-Element geklickt hat).
Es ist wichtig, diese Zeichen zu maskieren, damit der Client weiß, ob sie Daten oder ein Trennzeichen darstellen.
Beispiel ohne Flucht:
Beispiel, voll legitime URL
Beispiel für eine vollständig legitime URL im Wert des HTML-Attributs:
Auch wichtige Szenarien:
Javascript als Wert:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Ja,;;
ist richtig.)JSON als Wert:
<a href="..." data-analytics="{"event": "click"}">...</a>
Entkommene Dinge in entflohenen Dingen, doppelte Codierung, URL in URL innerhalb des Parameters usw., ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123
quelle
Ja, sollten Sie konvertieren
&
zu&
.Dieses HTML-Validator-Tool von W3C ist hilfreich für Fragen wie diese. Hier werden die Fehler und Warnungen für eine bestimmte Seite angezeigt.
quelle
&
in einem href nicht entkommen ) als Fehler erkennt .