Saya memposting jawaban baru karena saya menemukan jawaban zneak tidak memiliki cukup contoh, tidak menunjukkan penanganan HTML dan URI sebagai aspek dan standar yang berbeda dan ada beberapa hal kecil yang hilang.
Anda memiliki dua standar tentang URL di tautan ( <a href).
Standar pertama adalah RFC 1866 (HTML 2.0) di mana dalam "3.2.1. Data Characters" Anda dapat membaca karakter yang harus diloloskan ketika digunakan sebagai nilai untuk atribut HTML. (Atribut sendiri tidak memungkinkan karakter khusus sama sekali, misalnya <a hr&ef="http://...tidak diizinkan, juga tidak <a hr&ef="http://....)
Kemudian ini telah masuk ke standar HTML 4 , karakter yang Anda butuhkan untuk melarikan diri adalah:
< to <
> to >
& to &
" to "e;
' to '
Standar lainnya adalah RFC 3986 "Standar URI generik", di mana URL ditangani (ini terjadi ketika browser akan mengikuti tautan karena pengguna mengklik elemen HTML).
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Penting untuk melarikan diri dari karakter tersebut sehingga klien tahu apakah mereka mewakili data atau pembatas.
Contoh tidak terhapus:
https://example.com/?user=test&password&te&st&goto=https://google.com
Contoh, URL yang sepenuhnya sah
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Contoh URL sepenuhnya sah dalam nilai atribut HTML:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Skenario juga penting:
Javascript sebagai nilai:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>(Ya, ;;benar.)
JSON sebagai nilai:
<a href="..." data-analytics="{"event": "click"}">...</a>
Hal-hal yang lolos di dalam hal-hal yang lolos, pengkodean ganda, URL di dalam URL di dalam parameter dll, ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123