web-dev-qa-db-ja.com

XSSから保護するためのHTMLエンコーディング

XSSに対する保護に関するいくつかの参考資料を調べたところ、動的ページを生成するために使用する前に、(ユーザーが入力した)データをエンコードすることをお勧めします。私はこの声明の詳細な説明を見つけることができませんでした。私の質問は

  1. エンコーディングはXSSの防止にどのように役立ちますか?
  2. 保存されたXSSに対する完全な保護を提供しますか?
  3. 他に考慮すべき対策はありますか?.
7
Shurmajee

StackOverflowの私の回答 からコピー)

番号。
HtmlEncodeは単にすべてのXSS攻撃をカバーするわけではありません。
エンコーディングis正しい解決策ですが、常にHTMLエンコーディングではありません-context-sensitive encodingが必要です。

たとえば、サーバーで生成されたクライアント側のjavascriptを検討してください-サーバーは、htmlencodeされた値をクライアント側のjavascriptに直接動的に出力します。htmlencodeは、注入されたスクリプトを停止しません実行から。

次に、次の疑似コードを考えます。

<input value=<%= HtmlEncode(somevar) %> id=textbox>

さて、それがすぐに明らかでない場合は、somevar(もちろんユーザーによって送信されます)がたとえばに設定されている場合

a onclick=alert(document.cookie)

結果の出力は

<input value=a onclick=alert(document.cookie) id=textbox>

これは明らかに機能します。明らかに、これは(ほぼ)他のスクリプトにすることができます...そしてHtmlEncodeはあまり役に立ちません。

考慮すべきいくつかの追加のベクトルがあります... DOMベースのXSSと呼ばれるXSSの3番目のフレーバー(悪意のあるスクリプトがクライアントで動的に生成されます(例:#値に基づいて))。

また、UTF-7タイプの攻撃についても忘れないでください。

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

そこにエンコードするものは何もありません...

もちろん、解決策は(適切で制限的なホワイトリスト入力検証に加えて)context-sensitiveエンコーディングを実行することです:HtmlEncodingは、出力コンテキストIS HTML、またはおそらくJavaScriptEncoding、VBScriptEncoding、またはAttributeValueEncodingなどが必要です。

MS ASP.NETを使用している場合は、必要なすべてのコンテキストエンコーディングメソッドを提供するAnti-XSSライブラリを使用できます。

すべてのエンコーディングは、ユーザー入力だけでなく、データベースやテキストファイルなどの格納された値にも限定されないことに注意してください。

ああ、HTTPヘッダーとMETAタグの両方で文字セットを明示的に設定することを忘れないでください。そうしないと、UTF-7の脆弱性が残ります...

最後に、保存されたXSSについて-ページ生成中にエンコードを行うため、データoutputについては、ユーザー入力(つまり、反射XSS)からのものであるかどうかにかかわらず、データのソースに関しては不可知論です)またはデータベース/ファイル(つまり、保存/永続XSS)。 (基本的にはそうです)

いくつかの詳細情報とかなり決定的なリスト(更新されていません)は、RSnakeのチートシートをチェックしてください: http://ha.ckers.org/xss.html

17
AviD

基本的にXSSは、攻撃者が潜在的な被害者によって表示されたWebページ上で何らかの不正なスクリプトの実行に成功した場合に発生します。そのため、Webページに印刷する前にフィールドをHtmlEncodeすると、ページはデータをスクリプトとして解釈しません。文字はコンテンツとして解釈され、コンテンツはそのままページに印刷されます。

例:次のようなものがあると言う

<form action="/printname" >
  <input type="textbox" name="name">
  <input type="submit">
</form>

サーバー側には次のようなものがあります

k=request.GET['name']
return HttpResponse("hai" + k)

ユーザーが名前を次のように入力した場合

<script>alert("hia")</script>

ページはスクリプトを印刷する代わりに実行します。ただし、HttpResponse関数が出力をクライアントに送信する前にHTMLエンコードすると仮定すると、<&lt;に置き換えられ、>&gt;に置き換えられ、二重引用符が使用されます。 &quot;に置き換えられます。

結果は、スクリプトではなくコンテンツとして出力を解釈するページになります。

私の答えが明確であることを願っています。また、保存された値は印刷前にエンコードされるため、保存されたXSSの防止に役立ちます。

6
aRun