Publikuję nową odpowiedź, ponieważ uważam, że odpowiedź zneak nie zawiera wystarczającej liczby przykładów, nie pokazuje obsługi HTML i URI jako różnych aspektów i standardów oraz brakuje w niej kilku drobnych rzeczy.
Masz dwa standardy dotyczące adresów URL w linkach ( <a href
).
Pierwszym standardem jest RFC 1866 (HTML 2.0), gdzie w „3.2.1. Znaki danych” można odczytać znaki, które muszą zostać zmienione, gdy są używane jako wartość atrybutu HTML. (Same atrybuty w ogóle nie zezwalają na znaki specjalne, np. <a hr&ef="http://...
Nie są dozwolone ani nie są <a hr&ef="http://...
).
Później przeszło to do standardu HTML 4 , znaki, których potrzebujesz, to:
< to <
> to >
& to &
" to "e;
' to '
Drugim standardem jest RFC 3986 „Generic URI standard”, w którym obsługiwane są adresy URL (dzieje się tak, gdy przeglądarka ma zamiar przejść do odsyłacza, ponieważ użytkownik kliknął element HTML).
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Ważne jest, aby uniknąć tych znaków, aby klient wiedział, czy reprezentują dane, czy separator.
Przykład bez zmiany znaczenia:
https://example.com/?user=test&password&te&st&goto=https://google.com
Przykład, w pełni legalny adres URL
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Przykład w pełni poprawnego adresu URL w wartości atrybutu HTML:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Również ważne scenariusze:
Javascript jako wartość:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Tak, ;;
ma rację).
JSON jako wartość:
<a href="..." data-analytics="{"event": "click"}">...</a>
Elementy uciekające w elementach ze znakami ucieczki, podwójne kodowanie, adres URL wewnątrz adresu URL w parametrze itp., ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123