Sto pubblicando una nuova risposta perché trovo che la risposta di zneak non abbia abbastanza esempi, non mostri la gestione di HTML e URI come aspetti e standard diversi e manchi alcune cose minori.
Hai due standard riguardanti gli URL nei link ( <a href).
Il primo standard è RFC 1866 (HTML 2.0) dove in "3.2.1. Caratteri dati" è possibile leggere i caratteri che devono essere salvati quando utilizzati come valore per un attributo HTML. (Gli attributi stessi non consentono affatto caratteri speciali, ad es. <a hr&ef="http://...Non è consentito, né lo è <a hr&ef="http://....)
Successivamente questo è entrato nello standard HTML 4 , i caratteri che devi scappare sono:
< to <
> to >
& to &
" to "e;
' to '
L'altro standard è RFC 3986 "Standard URI generico", in cui vengono gestiti gli URL (ciò accade quando il browser sta per seguire un collegamento perché l'utente ha fatto clic sull'elemento HTML).
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
È importante sfuggire a quei caratteri in modo che il client sappia se rappresentano dati o un delimitatore.
Esempio senza caratteri di escape:
https://example.com/?user=test&password&te&st&goto=https://google.com
Esempio, URL completamente legittimo
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Esempio di URL completamente legittimo in valore dell'attributo HTML:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Anche scenari importanti:
Javascript come valore:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>(Sì, ;;è corretto.)
JSON come valore:
<a href="..." data-analytics="{"event": "click"}">...</a>
Elementi di escape in oggetti di escape, doppia codifica, URL all'interno di URL all'interno di parametri ecc., ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123