XSS対策 ================================================================================ .. only:: html .. contents:: 目次 :local: | .. _SpringSecurityXSS: 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 | .. _xss_how_to_use_ouput_escaping: Output Escaping ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | XSSの脆弱性への対応としては、HTML特殊文字をエスケープすることが基本である。 | HTMLにおいてエスケープが必要な特殊文字の例は、以下の通りである。 .. tabularcolumns:: |p{0.50\linewidth}|p{0.50\linewidth}| .. list-table:: :header-rows: 1 :widths: 50 50 * - | エスケープ前 - | エスケープ後 * - | "\ ``&``\ " - | \ ``&``\ * - | "\ ``<``\ " - | \ ``<``\ * - | "\ ``>``\ " - | \ ``>``\ * - | "\ ``"``\ " - | \ ``"``\ * - | "\ ``'``\ " - | \ ``'``\ | XSSを防ぐために、JSPでは文字列として出力するすべての表示項目に、\ ``f:h()``\ を使用すること。 | また、Thymeleafでテキストを出力する方法には\ ``th:text``\ 属性、\ ``th:utext``\ 属性の二種類が存在する。 | 詳細は、\ :url_thymeleaf_tutorial:`Tutorial: Using Thymeleaf -Unescaped Text- `\ を参照されたい。 * \ ``th:text``\ 属性を使用すると値をエスケープして出力する * \ ``th:utext``\ 属性を使用すると値をエスケープせずに出力する XSSを防ぐために、Thymeleafでは\ ``th:text``\ 属性を使用すること。 入力値を別画面に再出力するアプリケーションを例に説明する。 | 出力値をエスケープしない脆弱性のある例 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 本例は、あくまで参考例として載せているだけなので、\ **以下のような実装は決して行わないこと**\ 。 .. tabs:: .. group-tab:: JSP \ **出力画面の実装**\ .. code-block:: jsp