Meta SO に関する投稿に出くわしました。エンコードされていない HTML 文字とエンコードされている HTML 文字の微妙な違い、HTML 属性、コンテキスト: セキュリティ、ベスト プラクティス、ブラウザー サポートについて興味があります。
2 に答える
HTML エンコーディングは、HTML マークアップで意味的に意味のある特定の文字を、マークアップの解析に影響を与えずにユーザーに表示できる同等の文字に置き換えます。
最も重要で明白な文字は <、>、&、および " であり、これらはそれぞれ、、、、および に置き換えられ<
ます。>
さらに、エンコーダーは上位文字を同等の HTML エンティティ エンコーディングに置き換えることができるため、コンテンツを保持して保存することができます。ページが ASCII としてブラウザに送信された場合でも、適切にレンダリングされます。&
"
一方、HTML 属性エンコーディングは、文字列が HTML 要素の属性を壊すのを防ぐために重要な文字のサブセットのみを置き換えます。具体的には、通常、"、&、および < を 、、および に置き換えるだけです"
。&
これ<
は、属性の性質、それらに含まれるデータ、およびブラウザーまたは HTML パーサーによってそれらが解析および解釈される方法が、 HTML ドキュメントとその要素が読み込まれます。
それが XSS にどのように関係するかという点では、外部ソース (ユーザーなど) からの文字列を適切にサニタイズして、ページを壊したり、さらに重要なこととして、アプリケーションを変更または破壊する可能性のあるマークアップやスクリプトを挿入したりしないようにする必要があります。 (ブラウザまたはプラットフォームの脆弱性を利用して) ユーザーのマシンに影響を与えます。
ユーザーが生成したコンテンツをページに表示したい場合は、文字列を HTML エンコードしてマークアップに表示すると、XSS や壊れたマークアップを心配することなく、入力したすべての文字列が表示されます。
ユーザーが生成したコンテンツを属性内の要素 (たとえば、tooltip
リンク上の a) に添付する必要がある場合は、属性をエンコードして、コンテンツが要素のマークアップを壊さないようにします。
HTMLエンコーディングと同じ関数を使用して、属性エンコーディングを処理できますか? 技術的には、はい。リンクしたメタ質問の場合、エンコードされたHTMLを取得してデコードし、その結果を属性値として使用しているように聞こえます。これにより、エンコードされたマークアップが文字通り表示されます。