Je poste une nouvelle réponse parce que je trouve que la réponse de zneak ne contient pas assez d'exemples, ne montre pas la gestion du HTML et des URI comme des aspects et des normes différents et manque de petites choses.
Vous avez deux standards concernant les URL dans les liens ( <a href).
La première norme est RFC 1866 (HTML 2.0) où dans "3.2.1. Caractères de données" vous pouvez lire les caractères qui doivent être échappés lorsqu'ils sont utilisés comme valeur pour un attribut HTML. (Les attributs eux-mêmes n'autorisent pas du tout les caractères spéciaux, par exemple, ce <a hr&ef="http://...n'est pas autorisé, ni<a hr&ef="http://... .)
Plus tard, cela est entré dans la norme HTML 4 , les caractères dont vous avez besoin pour échapper sont:
< to <
> to >
& to &
" to "e;
' to '
L'autre standard est la RFC 3986 "Generic URI standard", où les URL sont gérées (cela se produit lorsque le navigateur est sur le point de suivre un lien parce que l'utilisateur a cliqué sur l'élément HTML).
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Il est important d'échapper à ces caractères pour que le client sache s'ils représentent des données ou un délimiteur.
Exemple non échappé:
https://example.com/?user=test&password&te&st&goto=https://google.com
Exemple, URL entièrement légitime
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Exemple d'URL entièrement légitime dans la valeur de l'attribut HTML:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Également des scénarios importants:
Javascript comme valeur:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>(Oui, ;;c'est exact.)
JSON comme valeur:
<a href="..." data-analytics="{"event": "click"}">...</a>
Objets échappés à l'intérieur des objets échappés, double encodage, URL dans l'URL à l'intérieur du paramètre, etc.
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123