Я публикую новый ответ, потому что обнаружил, что в ответе 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 = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Важно избегать этих символов, чтобы клиент знал, представляют ли они данные или разделитель.
Пример unescaped:
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 внутри URL внутри параметра и т. Д., ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123