zneakの回答には十分な例がなく、HTMLとURIの処理がさまざまな側面と標準として示されておらず、いくつかの小さな欠けているため、新しい回答を投稿しています。
リンクのURLに関する2つの標準があります(<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 '
もう1つの標準は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
HTML属性の値の完全に正当なURLの例:
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