Я публікую нову відповідь, тому що я вважаю, що у відповіді zneak не вистачає прикладів, не показано обробку HTML та URI як різних аспектів та стандартів, а деякі незначні речі відсутні.
У вас є два стандарти щодо URL-адрес у посиланнях ( <a href
).
Перший стандарт - RFC 1866 (HTML 2.0), де в розділі "3.2.1. Символи даних" ви можете прочитати символи, які потрібно уникнути, використовуючи як значення для атрибута HTML. (Атрибути самі по собі взагалі не дозволяють використовувати спеціальні символи, наприклад, <a hr&ef="http://...
це не дозволено, також немає <a hr&ef="http://...
.)
Пізніше це перейшло у стандарт HTML 4 , символи, від яких вам потрібно уникнути, є:
< to <
> to >
& to &
" to "e;
' to '
Інший стандарт - RFC 3986 "Загальний стандарт URI", де обробляються URL-адреси (це відбувається, коли браузер збирається перейти за посиланням, оскільки користувач натиснув на елемент HTML).
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Важливо уникати цих символів, щоб клієнт знав, наскільки вони представляють дані або роздільник.
Приклад без нагляду:
https://example.com/?user=test&password&te&st&goto=https://google.com
Наприклад, повністю законна URL-адреса
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Приклад повністю законної URL-адреси у значенні атрибута HTML:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Також важливі сценарії:
Javascript як значення:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Так, ;;
правильно.)
JSON як значення:
<a href="..." data-analytics="{"event": "click"}">...</a>
Уникнуті речі всередині втечених речей, подвійне кодування, URL всередині параметра і т.д., ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123