XSS対策 ================================================================================ .. only:: html .. contents:: 目次 :local: Overview -------------------------------------------------------------------------------- | クロスサイトスクリプティング(以下、XSSと略す)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、 | サイト間を横断して悪意のあるスクリプトを混入させることである。 | 例えば、ウェブアプリケーションが入力したデータ(フォーム入力など)を、適切にエスケープしないまま、HTML上に出力することにより、 | 入力値に存在するタグなどの文字が、そのままHTMLとして解釈される。 | 悪意のある値が入力された状態で、スクリプトを起動させることにより、クッキーの改ざんや、 | クッキーの値を取得することによる、セッションハイジャックなどの攻撃が行えてしまう。 Stored, Reflected XSS Attacks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ XSS攻撃は、大きく分けて二つのカテゴリに分けられる。 **Stored XSS Attacks** | Stored XSS Attacksとは、悪意のあるコードが、永久的にターゲットサーバ上(データベース等)に格納されていることである。 | ユーザは、格納されている情報を要求するときに、サーバから悪意のあるスクリプトを取得し、実行してしまう。 **Reflected XSS Attacks** | Reflected attacksとは、リクエストの一部としてサーバに送信された悪意のあるコードが、 | エラーメッセージ、検索結果、その他いろいろなレスポンスからリフレクションされることである。 | ユーザが、悪意のあるリンクをクリックするか、特別に細工されたフォームを送信すると、 | 挿入されたコードは、ユーザのブラウザに、攻撃を反映した結果を返却する。 | その結果、信頼できるサーバからきた値のため、ブラウザは悪意のあるコードを実行してしまう。 Stored XSS Attacks、Reflected XSS Attacksともに、出力値をエスケープすることで防ぐことができる。 | How to use -------------------------------------------------------------------------------- | ユーザーの入力を、そのまま出力している場合、XSSの脆弱性にさらされている。 | したがって、XSSの脆弱性に対する対抗措置として、HTMLのマークアップ言語で、特定の意味を持つ文字をエスケープする必要がある。 必要に応じて、3種類のエスケープを使い分けること。 エスケープの種類: * Output Escaping * JavaScript Escaping * Event handler Escaping Output Escaping ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | XSSの脆弱性への対応としては、HTML特殊文字をエスケープすることが基本である。 | エスケープが必要なHTML上の特殊文字の例と、エスケープ後の例は、以下の通りである。 .. tabularcolumns:: |p{0.50\linewidth}|p{0.50\linewidth}| .. list-table:: :header-rows: 1 :widths: 50 50 * - エスケープ前 - エスケープ後 * - ``&`` - ``&`` * - ``<`` - ``<`` * - ``>`` - ``>`` * - ``"`` - ``"`` * - ``'`` - ``'`` | XSSを防ぐために、文字列として出力するすべての表示項目に、\ ``f:h()``\ を使用することを必須とする。 | 入力値を、別画面に再出力するアプリケーションを例に、説明する。| 出力値をエスケープしない脆弱性のある例 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | 本例は、あくまで参考例として載せているだけなので、以下のような実装は、決して行わないこと。 **出力画面の実装** .. code-block:: jsp