web-dev-qa-db-ja.com

'&'を '&'としてエンコードする必要がありますか。

私は私のサイトの&でHTML5とUTF-8で '<title>'シンボルを使っています。タイトルに含まれるすべてのブラウザがそうであるように、GoogleはそのSERPにアンパサンドをうまく示しています。

http://validator.w3.org 私にこれを与えています:

&は文字参照を開始しませんでした。 (おそらく&amp;としてエスケープされているはずです。)

本当に&amp;をする必要がありますか?

私は自分のページがバリデーションのためにバリデーションすることに悩んでいるわけではありませんが、これについての人々の意見を聞きたいのです。

191
Haroldo

はい。エラーで述べたように、HTMLでは、属性は#PCDATAであり、解析されています。これは、属性に文字実体を使用できることを意味します。 &を単独で使用するのは間違っています。寛容なブラウザではなく、これがXHTMLではなくHTMLであるという事実があると、構文解析が中断されます。 &amp;としてそれをエスケープするだけで、すべてうまくいくでしょう。

HTML5では、それをエスケープしないでおくことができますが、それに続くデータが有効な文字参照のように見えない場合に限ります。しかし、どちらがそうであるべきか、どれがそうである必要はないかを心配するよりも、このシンボルのすべてのインスタンスをエスケープすることが賢明です。

この点に留意してください。 &から&amp;をエスケープしないのであれば、作成するデータには十分ではありません(コードが非常に無効になる可能性がある場合)。タグデリミタをエスケープしないこともあります。 HTMLやスクリプトの挿入、クッキーの盗用などの悪用につながる可能性が非常に高いです。

コードをエスケープしてください。それは将来あなたに多くのトラブルを救うでしょう。

134
Delan Azabani

検証は別として、特定の文字をエンコードすることはHTML文書にとって重要であるという事実は変わりません。それは、それがWebページとして正しく安全にレンダリングできるようにするためです。

私にとっては、あらゆる状況で&&amp;としてエンコードするのが簡単なルールであり、エラーや失敗の可能性を減らすことができます。

以下を比較してください。どちらが簡単ですか。これは簡単ですバグを増やすために

方法論1

  1. アンパサンド文字を含む内容を書きます。
  2. それらすべてをエンコードします。

方法論2

(一粒の塩で、どうぞ;))

  1. アンパサンド文字を含む内容を書きます。
  2. ケースバイケースで、それぞれのアンパーサンドを見てください。次の事項を決定してください。
    • それは孤立しており、それ自体は明白にアンパサンドです。例えば。 volt & amp
      >その場合は、エンコードする必要はありません。
    • 分離されているわけではありませんが、結果として生じるエンティティは存在せず、エンティティリストが決して進化しないため存在することはないので、それでも曖昧さはありません。例:amp&volt
      >その場合は、エンコードする必要はありません。
    • それは孤立しておらず、曖昧です。例えば。 volt&amp
      >エンコードしてください。

51

私はこれを徹底的に研究し、そして私の調査結果についてここに書いた: http://mathiasbynens.be/notes/ambiguous-ampersands

私は オンラインツール も作成しました。マークアップであいまいなアンパサンドやセミコロンで終わらない文字参照をチェックすることはできますが、どちらも無効です。 (現在、HTMLバリデーターはこれを正しく行いません。)

http://i.imgur.com/cLssU.png

31
Mathias Bynens

HTML 5の規則はHTML 4とは異なります。 HTML5では必須ではありません - アンパサンドがパラメータ名を開始するように見えない限り。 "&copy = 2"はまだ問題です、例えば&copy;著作権記号です。

しかし、次の文章に応じて、エンコードするかどうかを決定するのは難しい作業のようです。そのため、最も簡単な方法は、常にエンコードすることです。

19
Matthew Wilson

私はこれがもっと「ブラウザが気にしないときに仕様に従う」という質問になったと思います。これが私の一般的な答えです。

規格は「現在の」ものではありません。それらは「未来」のものです。開発者としてWeb標準に従うと、ブラウザベンダーはそれらの標準を正しく実装する可能性が高くなり、CSSハック、機能検出、ブラウザ検出が不要な、完全に相互運用可能なWebに移行します。なぜ私たちのレイアウトが特定のブラウザで壊れているのか、それを回避する方法を理解する必要はありません。

具体的には、HTML 5で&amp; Bを使用する必要がない場合あなたの特定の状況では、そしてあなたはHTML5 Doctypeを使っていて(そしてまたあなたのユーザがHTML5準拠のブラウザを使っていることを期待していて)そしてそれをする理由はありません。

13
Ryan Kinal

まあ、それがユーザー入力から来ているなら、それから明らかにそうです、明白な理由のために。このウェブサイトではうまくいかなかったのではないかと考えてください。この質問のタイトルは「&」を「&」としてエンコードする必要がありますかと表示されます。

それがecho '<title>Dolce & Gabbana</title>';のようなものであれば、厳密に言えばあなたはそうする必要はありません。それはより良いでしょう、しかしあなたが誰もいなければ違いに気付くでしょう。

5
Thomas Bonini

あなたのtitleが実際に何であるかを教えていただけますか?提出するとき

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

http://validator.w3.org/ - 明示的に実験的なHTML 5モードを使うように頼む - それは&sについて何の不満もありません...

5
AakashM

HTMLでは、&は、 文字参照 または エンティティ参照 のいずれかの参照の始まりを示します。その時点から、パーサーは文字参照を示す#、またはエンティティー参照を示すエンティティー名のどちらかと、それに続く;のいずれかを期待します。それが通常の動作です。

ただし、参照名または参照を開く&の後に空白または"'<>&のような他の区切り文字が続く場合、末尾の;および単純な&を表す参照も省略できます。

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>

これらの場合に限って、;の末尾または参照自体さえも省略することができます(少なくともHTML 4では)。私はHTML 5が;の終わりを必要とすると思います。

しかし、混乱を避けるために、文字参照&#38;またはエンティティ参照&amp;のような参照を常に使用するには、 仕様推奨 を使用します。

著者は、文字参照(実体参照のオープン区切り文字)の始まりとの混同を避けるために、 "&amp;"の代わりに "&"(ASCII 10進数38)を使用するべきです。文字参照はCDATA属性値内で許可されているため、作成者は属性値に "&amp;"も使用する必要があります。

4
Gumbo

ユーザーがそれをあなたに渡した場合、またはURLになった場合は、それをエスケープする必要があります。

それがページ上に静的テキストで表示される場合どちらの方法でもすべてのブラウザでこの問題が解決されます。問題ないので、問題はありません。

3
Dean J

数年前、私たちのWebアプリの1つがFirefoxで正しく表示されなかったという報告を受けました。ページに次のようなタグが含まれていたことがわかりました

<div style="..." ... style="...">

繰り返しのスタイル属性に直面した場合、IEは両方のスタイルを組み合わせますが、Firefoxはそれらのうちの1つのみを使用するため、動作が異なります。タグをに変更しました

<div style="...; ..." ...>

そして確かに、それは問題を解決しました!物語の教訓は、ブラウザが無効なHTMLよりも有効なHTMLのより一貫した取り扱いを持っているということです。だから、すでにあなたのいまいましいマークアップを修正する! (あるいはそれを修正するためにHTML Tidyを使う。)

2
dan04

はい、可能であれば有効なコードを提供するようにしてください。

ほとんどのブラウザはこのエラーを黙って修正しますが、ブラウザのエラー処理に頼ることには問題があります。不正なコードの処理方法に関する標準はないため、各エラーの処理方法を判断するのは各ブラウザベンダーの責任です。結果は異なる場合があります。

ブラウザが異なる反応をする可能性がある例としては、要素をテーブルの内側でテーブルのセルの外側に配置する場合や、相互にリンクを入れ子にする場合などがあります。

具体的な例では問題ないと思われますが、ブラウザのエラー修正によって、ブラウザが標準準拠モードから奇妙なモードに変わるなど、レイアウトが完全に崩れる可能性があります。

それで、あなたがより深刻な問題を見つけることができるようにバリデータの中のエラーリストを短く保つために他に何かのためにそうでないならば、あなたはコードのこのようなエラーを修正するべきです。

2
Guffa

なぜImage URLがエスケープする必要があるのか​​を調べていたので、 https://validator.w3.org で試してみました。説明はかなりいいです。 URLでもエスケープする必要があることが強調されています。 [PS:URLが&を必要としていたので、いつ消費されたかはエスケープできないと思います。誰もが明確にすることができますか?

<img alt="" src="foo?bar=qut&qux=fop" />

実体参照が文書内に見つかりましたが、定義されたその名前による参照はありません。多くの場合、これは参照名のスペルミス、エンコードされていないアンパサンド、または末尾のセミコロン(;)を省略することによって発生します。このエラーの最も一般的な原因は、「URLのアンパサンド」でWDGによって説明されているように、URLのアンコードされたアンパサンドです。実体参照はアンパサンド(&)で始まりセミコロン(;)で終わります。文書内でリテラルアンパサンドを使用したい場合は、「&」としてエンコードする必要があります(URL内でも)。実体参照をセミコロンで終了しないように注意してください。そうしないと、実体参照が次のテキストに関連して解釈される可能性があります。また、名前付き実体参照では大文字と小文字が区別されることに注意してください。 &Aelig;とæは異なる文字です。このエラーがPHPのセッション処理コードによって生成されたマークアップに表示される場合は、この記事であなたの問題に対する説明と解決策があります。

2
Nishant

それはセミコロンがあなたの&の近くで終わる可能性に依存しています。

たとえば、ユーザーからの入力を処理する場合(たとえば、ユーザーが提供したフォーラム投稿の件名をタイトルタグに含める場合)、ユーザーがランダムなセミコロンをどこに配置しているのかわからなくなり、奇妙なエンティティがランダムに表示されます。だからそのような状況では常に逃げる。

あなた自身の静的なhtmlについては、確かに、あなたはそれをスキップすることができます、しかしそれはそれを避けるための正当な理由がないように適切なエスケープを含むことはとても自明です。

1
Douglas

&htmlで使用されている場合は、それをエスケープする必要があります

&がjavascript文字列で使用されている場合あなたがそれを使う必要がないalert('This & that');またはdocument.href。

Document.writeを使用している場合は、それを使用する必要があります。 document.write(<p>this &amp; that</p>)

1
Alex

の場合、本当に静的テキストについて話しています

<title>Foo & Bar</title>

ハードディスク上のファイルに保存され、サーバーから直接配信されます。そうすれば、おそらくエスケープする必要はないでしょう。

しかし、今日では非常にHTMLコンテンツはほとんどないので、HTMLコンテンツは他のソース(データベースコンテンツ、ユーザー、ユーザー)から生成されていると仮定して次の免責事項を追加します。入力、Webサービス呼び出し結果、従来のAPI結果、...):

単純な&をエスケープしない場合は、&amp;&nbsp;<b><script src="http://attacker.com/evil.js">、またはその他の無効なテキストもエスケープしないでください。それはあなたがせいぜいあなたのコンテンツを誤って表示していることを意味し、そしてより可能性が高いです XSS攻撃

言い換えれば、他のもっと問題のあるケースをすでにチェックしてエスケープしているときには、完全に壊れていないがまだやや魚っぽいスタンドアローンのままにする理由はほとんどありません。

0
Joachim Sauer