アンパサンドを<ahref…>でエンコードしますか?


157

私は自動的にHTMLを生成するコードを書いていて、それを適切にエンコードしたいと思っています。

次のURLへのリンクを生成するとします。

http://www.google.com/search?rls=en&q=stack+overflow

すべての属性値をHTMLエンコードする必要があると想定しています。(間違っている場合は修正してください。)つまり、上記のURLをアンカータグに挿入する場合は、アンパサンドを次の&amp;ようにエンコードする必要があります。

<a href="http://www.google.com/search?rls=en&amp;q=stack+overflow">

あれは正しいですか?



6
@CiroSantilli:実際のURL文字列についてです。これは、HTML属性に表示されるときにそれらがどのようにエンコードされるかについてです。
JW。

私が見るように、アンパサンドのエンコーディングはhtml5では必ずしも必要ではなく、回答は古くなっています。
ディナー

1
HTML5のための質問:stackoverflow.com/questions/19441750/...
qdinar

回答:


175

はい、そうです。HTMLエンティティはHTML属性内で解析され、迷子に&なるとあいまいさが生じます。そのため、すべての内部では&amp;なく常に書き込む必要が&あります HTML属性のます。

&とはいえ、引用符のみをエンコードする必要があります。é属性に特殊文字がある場合は、HTMLパーサーを満たすためにそれらをエンコードする必要はありません。

以前は、URLになどの非ASCII文字を使用した特別な処理が必要でしたé。あなたはパーセントエスケープを使用して、それらをコードすることがあったが、この場合には与えるだろう%C3%A9彼らはによって定義されたため、RFC 1738。ただし、RFC 1738はRFC 3986(URI、Uniform Resource Identifiers)およびRFC 3987(IRI、Internationalized Resource Identifiers)に取って代わられており、それらに基づいWhatWGは、非ASCIIのURLが表示された場合のブラウザーの動作を定義するHTML5以降の文字。したがって、URLにASCII以外の文字を含めても、パーセントエンコードされていてもいなくても安全です。


1
私はこれをかなり確信していました、しかし、私には疑いのまれな瞬間がありました。確認していただきありがとうございます。
JW。

1
スペースを%20ではなく「+」としてエンコードすることもできます。これにより、URLが読みやすくなります。
NickG 2013

1
+価値があるため、現在、ネイティブのiPhoneメールクライアントのmailtoリンクでは尊重されていません。
Ryan Olson


4
(この間違いに陥ったばかりのように)テンプレートエンジンに依存している場合は、HTMLエンティティのエスケープを自動的に処理するかどうかを確認する必要があることを付け加えます。私の場合、Twigはそれを行っていましたが、&amp;直接使用するのではなく、タグ属性への書き込みを誤ってダブルエスケープしていました&
カマフェザー2015年

24

現在の公式HTML勧告では、アンパサンドは、たとえば&amp;このようなコンテキストのようにエスケープする必要があります。ただし、ブラウザはこれを必要とせず、HTML5 CRはこれをルールにすることを提案しているため、属性値には特別なルールが適用されます。現在のHTML5バリデーターはこの点で古くなっています(コメント付きのバグレポートを参照)。

属性値のアンパサンドをエスケープすることは引き続き可能ですが、現在のツールでの検証を除いて、値でアンパサンドをエスケープする必要は実際にはありませんhref(エスケープを開始すると、間違いをするリスクが少しあります)。


4
ただし、XHTML(として送信される実際の XHTML application/xhtml+xml)は、常にそれを必要とします。
zneak 2013年

4
まだ議論され、議論され、誤解されているこの変更の注意点の1つ&は、「あいまいでない」限り、問題がないことです。アンパサンドを曖昧にする1つの明白な方法は、最初にスペース以外の文字を続け、次にセミコロンを続けることです。それアンパサンドは今あいまいで、かつますパースエラーが発生します。
2015

Jukkaが言ったように、すべてのアンパサンドをエンコードするリスクは確かにあります。そのため、hrefのURLの1つにセミコロンが含まれている可能性がどれだけあるかを考慮してください。セミコロンの付いたURLを見たことがないので、どちらかと言えば可能性は低いです。それができないわけではない。だから実際には、私たちの使用&が曖昧になる可能性は低いと思います。したがって、href属性ではエンコードせずに引き続き使用します。
2015

エスケープが必要な理由は、曖昧さの可能性があるためです。この特定の問題は、XSS攻撃ベクトル、不適切なレンダリング、またはすべての影響を99.99%の時間で引き起こしていない可能性がありますが、それが気にならない理由ではありません。正しくエスケープするのは難しく、常に間違いを犯す可能性があります。
Phil

5

zneakの回答には十分な例がなく、HTMLとURIの処理がさまざまな側面と標準として示されておらず、いくつかの小さな欠けているため、新しい回答を投稿しています。

リンクのURLに関する2つの標準があります(<a href)の。

最初の標準はRFC 1866(HTML 2.0)で、「3.2.1。データ文字」では、HTML属性の値として使用するときにエスケープする必要のある文字を読み取ることができます。(属性自体は特殊文字を許可しません。たとえば<a hr&ef="http://...、許可されていません<a hr&amp;ef="http://...

後でこれはHTML 4標準に移行しました。エスケープする必要がある文字は次のとおりです。

<   to   &lt;
>   to   &gt;
&   to   &amp;
"   to   &quote;
'   to   &apos;

もう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&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com

また、重要なシナリオ:

  • 値としてのJavaScript:

    <img src="..." onclick="window.location.href = &quot;https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com&quot;;">...</a>(はい、;;正しいです。)

  • 値としてのJSON:

    <a href="..." data-analytics="{&quot;event&quot;: &quot;click&quot;}">...</a>

  • エスケープされたものの中のエスケープされたもの、ダブルエンコーディング、パラメータの中のURLの中のURLなど...

    http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&amp;password=&quot;&quot;123


3

はい、変換&する必要があり&amp;ます。

W3Cによるこのhtml検証ツールは、このような質問に役立ちます。特定のページのエラーと警告が表示されます。


1
W3Cバリデーターがこれを(&hrefでエスケープされていない)エラーとして検出するかどうかはわかりません。
ChrisW 2016年

6
現在、W3Cバリデーターはエスケープされていない&を有効として受け入れます。規格が変更され、エンコーディングが不要になったということですか?(ここでほとんどの答えは時代遅れです)?もしそうなら、これはhrefまたは任意の属性にのみ適用されますか?
matteo 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.