クロスサイトスクリプティングの対策方法

security_2197

WebアプリケーションやWebサイトの脆弱性を利用し、不正なスクリプトを埋め込むクロスサイトスクリプティング。

ここでは、クロスサイトスクリプティング(XSS)の対策方法について解説いたします。

クロスサイトスクリプティングの対策方法

HTMLテキストの入力を許可しない場合

Webページに出力する全ての要素に対して、エスケープ処理を施す

Webページを構成する要素として、Webページの本文やHTMLタグの属性値等に相当する全ての出力要素にエスケープ処理を行います。

エスケープ処理とは、HTMLやプログラミング言語を別の文字列に置き換えることです。
例えば、HTMLはタグの記述に「< 」「>」という記号を用いるとき、このままではブラウザは「タグ」として認識します。

そこで、「<」「>」という特殊な表記法に置き換えることで、「< 」「>」を文字列として認識させることができます。

このような置き換えをエスケープ処理といいます。

エスケープ文字 エスケープ処理
& &amp;
< &gt;
> &gt;
&quot;
&#39;

脆弱性防止の観点からエスケープ処理が必須となるのは、下記項目のような文字列等です。

  • 外部からWebアプリケーションに渡される「入力値」の文字列
  • データベースやファイルから読み込んだ文字列
  • その他、何らかの文字列を演算によって生成した文字列
しかし、上述した条件にあてはまるかで判断するのではなく、テキストとして出力されるすべてに対してエスケープ処理を施すことが重要です。

なお、対象となる出力処理はHTTPレスポンスへの出力に限りません。JavaScriptのdocument.writeメソッドやinnerHTMLプロパティ等を使用して動的にWebページの内容を変更する場合も、同様の処理が必要です。

URLの出力は、「http://」や「https://」で始まるURLのみを許可

URLには、「http://」や「https://」から始まるものだけでなく、JavaScriptを実行できる「javascript:」の記述で始まるものもあります。

Webページに出力するリンク先や画像のURLが、外部からの入力に依存する形で動的に生成される場合、そのURLにスクリプトが含まれていると、クロスサイトスクリプティングが可能となる場合があります。

たとえば、利用者から入力されたリンク先のURLを「<a href=”リンク先のURL”>」の形式でWebぺージに出力するWebアプリケーションは、リンク先のURLに「javascript:」等から始まる文字列を指定された場合に、スクリプトを埋め込まれてしまう可能性があります。

スクリプトが挿入されないように、URLには「http://」や「https://」から始まる文字列のみを出力する「ホワイトリスト方式」で実装してください。

<script>~</script>要素の内容を動的に生成しない

Webページに出力する<script>…</script>要素の内容が、外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれてしまう可能性があります。

危険なスクリプトだけを排除する方法も考えられますが、危険なスクリプトであることを確実に判断することは難しいため、<script>…</script>要素の内容を動的に生成する仕様は、避けることをお勧めします。

CSSを任意のサイトから取り込めるようにしない

CSSには、expression関数等を利用してスクリプトを記述することができます。そのためサイトに置かれたCSSを取り込めるような仕様にしておくと、生成するWebページにスクリプトが注入されてしまう可能性があります。

CSSの内容を都度チェックし、危険なスクリプトを排除する方法も考えられます。しかし、手間がかかり、確実に排除することは難しいため、CSSを外部から指定可能な仕様は避けましょう。

HTMLテキストの入力を許可する場合

入力されたHTMLから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する

入力されたHTMLテキストに対して構文解析を行い、「ホワイトリスト方式」で許可する要素のみを抽出します。ただし、これには複雑なコーディングが要求されます。また、処理に負荷がかかるといった影響もあるため、実装には十分な検討が必要です。

全てのウェブアプリケーションに共通の対策

HTTPレスポンスヘッダのContent-Typeフィールドに文字コードを指定

HTTPのレスポンスヘッダのContent-Typeフィールドには、「Content-Type:text/html;charset=UTF-8」のように、文字コード(charset)を指定できます。

この指定を省略した場合、ブラウザは、文字コードを独自の方法で推定して、推定した文字コードにしたがって画面表示を処理します。

たとえば、一部のブラウザにおいては、HTMLテキストの冒頭部分等に特定の文字列が含まれていると、必ず特定の文字コードとして処理されています。

Content-Typeフィールドで文字コードの指定を省略した場合、攻撃者がこの挙動を悪用して、故意に特定の文字コードをブラウザに選択させるような文字列を埋め込んだ上、その文字コードで解釈した場合にスクリプトのタグとなるような文字列を埋め込む可能性があります。

そのため、Content-Typeの出力時にcharsetを省略することなく、必ず指定しましょう。

管理者別に見るクロスサイトスクリプティングの対策

ユーザー側

  • 最新のブラウザにアップデートする
  • 電子メール内やWeb上の不審なURLを安易にクリックしない
  • ブラウザのセキュリティ設定により、スクリプトの実行を無効化する
  • ウイルス対策製品により、不正スクリプトを検出し、実行をブロックする
  • セキュリティ対策製品の機能により、不正サイトへのアクセスをブロックする

Web管理者側

  • 根本的な解決のためには、Webサーバ側で脆弱性に対処することが必要であり、脆弱性を作りこまれないよう、Webアプリケーション作成時から対策を意識することが必要です
  • WebサーバやWebアプリケーションのミドルウェアを常に最新の状態にする
  • 脆弱性が作りこまれないようWebアプリケーションの処理を精査する
  • WAF(Web Application Firewall)、XSSフィルタなどのセキュリティ対策製品を導入する

IT管理者側

  • エンドポイントへ総合的なセキュリティソフトを導入し、常に最新の状態にする
  • ゲートウェイ上で不正サイトへの誘導を目的とした攻撃メールの受信をブロックする
  • ネットワーク内部から外部不正サイトへのアクセスをブロックする

関連記事

クロスサイトスクリプティングの被害内容と事例

2018.01.29

クロスサイトスクリプティングとは | 仕組みと攻撃手法

2018.01.29
パソコン訪問サポート
security_2197