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:
< to <
> to >
& to &
" to "e;
' to '
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).
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Es ist wichtig, diese Zeichen zu maskieren, damit der Client weiß, ob sie Daten oder ein Trennzeichen darstellen.
Beispiel ohne Flucht:
https://example.com/?user=test&password&te&st&goto=https://google.com
Beispiel, voll legitime URL
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Beispiel für eine vollständig legitime URL im Wert des HTML-Attributs:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
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