2012-11-06 20 views
7

私はpost on Meta SOに出くわしました。私はHTMLと属性のエンコーディングの微妙な違いを知りたいと思います。HTMLと属性のエンコーディング

+2

何の違いがありますか?あなたの質問は、いくつかの言葉が欠けているようです。 – Dai

+1

OPがと&orangesを比較している可能性があります。しかし私は類似点を見ることができません。 –

答えて

9

HTMLエンコーディングは、HTMLマークアップで意味的に意味のある特定の文字を置き換えます。マークアップの解析に影響を与えずにユーザーに表示できる同等の文字を置き換えます。それぞれ、<>&、および"に置き換えられている。また、エンコーダは、同等のHTMLエンティティを上位の文字を置き換えることが

最も重要かつ明白な文字>は、<され、&、そして "エンコードするので、コンテンツが保存され、ページがASCII形式でブラウザに送信された場合でも適切にレンダリングされます。

HTML属性エンコーディングは、aを防ぐために重要な文字のサブセット文字列がHTML要素の属性を壊すことはありません。具体的には、通常、 "、&、および<であり、&quot;,&amp;および&lt;である。これは、属性やそのデータ、ブラウザーやHTMLパーサーによって解析され、解釈される方法が、HTML文書とその要素がどのように読み取られるかとは異なるためです。

それはXSSとどのように関係するかという観点で

、あなたは適切に(ユーザなど)外部ソースから文字列をサニタイズしたいので、彼らはあなたのページを破る、あるいはもっと重要なのは、マークアップやスクリプトを挿入しませんブラウザまたはプラットフォームの脆弱性を利用して、アプリケーションを変更または破棄したり、ユーザーのマシンに影響を与える可能性があります。

ページでユーザー生成コンテンツを表示する場合は、HTMLエンコードしてマークアップに表示すると、入力したすべての文字列がXSSや壊れたマークアップを気にせずにそのまま表示されます。

ユーザー生成コンテンツを属性内の要素(たとえば、リンク上のtooltip)に添付する必要がある場合は、コンテンツが要素のマークアップを破らないようにencode属性を設定します。

属性エンコードを処理するためにHTMLエンコードに同じ機能を使用できますか?技術的には、はい。リンクしたメタ質問の場合、エンコードされたHTMLを取り出してデコードし、その結果を属性値として使用して、エンコードされたマークアップが文字通り表示されるように思えます。

+0

HTML5は二重引用符で囲まれた単一引用符で囲まれた属性とquoteless属性をサポートしているため、属性でエスケープする文字のアドバイスは一般的ではありません。 onclickのようなjavascriptイベントハンドラでは、常に二重引用符で囲まれた属性を使用し、データを保持することはないと仮定します。 – Erlend

+0

ここで属性のエンコードのコードをご覧ください:https://github.com/chrisisbeef/jquery-encoder/blob/master/src/main/javascript/org/owasp/esapi/jquery/encoder.js – Erlend

+0

ちょっとした修正。 2番目の段落から:「具体的には、通常、「&」、「&」を「"」、「&」、「>」と置き換えます。「<< –

3

私はOWASP XSS Prevention Rules 1 and 2を見ることをお勧めします。
要約... HTML

ため

ルール1は、HTMLエンティティのエンコーディングで、次の文字をエスケープ

...
& - >&amp;
< - >&lt;
> - >&gt;
" - >&quot;
' - >&#x27;
/ - >&#x2F;

ルール2HTML共通するのは、ASCII値& #xHH未満256を持つすべての文字をエスケープし、英数字を除き

属性。属性(または使用可能な場合は名前付きエンティティ)を使用して、属性の切り替えを防止します。このルールが非常に広い理由は、開発者が頻繁に属性を引用符で囲まないようにするためです。適切に引用された属性は、対応する引用符でのみエスケープできます。引用符で囲まれていない属性は、[space]%* +、 - /;を含む多くの文字で区切ることができます。 < => ^と|。