name.Caution本バージョンの内容は既に古くなっています。最新のガイドラインはこちらからご参照ください。Overview¶クロスサイトスクリプティング(以下、XSSと略す)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、サイト間を横断して悪意のあるスクリプトを混入させることである。入力値に存在するタグなどの文字が、そのままHTMLとして解釈される。悪意のある値が入力された状態で、スクリプトを起動させることにより、クッキーの改ざんや、クッキーの値を取得することによる、セッションハイジャックなどの攻撃が行えてしまう。Attacks¶XSS攻撃は、大きく分けて二つのカテゴリに分けられる。Attacksとは、悪意のあるコードが、永久的にターゲットサーバ上(データベース等)に格納されていることである。ユーザは、格納されている情報を要求するときに、サーバから悪意のあるスクリプトを取得し、実行してしまう。attacksとは、リクエストの一部としてサーバに送信された悪意のあるコードが、エラーメッセージ、検索結果、その他いろいろなレスポンスからリフレクションされることである。挿入されたコードは、ユーザのブラウザに、攻撃を反映した結果を返却する。その結果、信頼できるサーバからきた値のため、ブラウザは悪意のあるコードを実行してしまう。Attacksともに、出力値をエスケープすることで防ぐことができる。use¶ユーザーの入力を、そのまま出力している場合、XSSの脆弱性にさらされている。したがって、XSSの脆弱性に対する対抗措置として、HTMLのマークアップ言語で、特定の意味を持つ文字をエスケープする必要がある。必要に応じて、2種類のエスケープを使い分けること。Escaping¶XSSの脆弱性への対応としては、HTML特殊文字をエスケープさせて対策することが基本である。エスケープが必要なHTML上の特殊文字の例と、エスケープ後の例は、以下の通りである。&#39;XSSを防ぐために、文字列として出力するすべての表示項目に、f:h()を使用することを必須とする。入力値を、別画面に再出力するアプリケーションを例に、説明する。本例は、あくまで参考例として載せているだけなので、以下のような実装は、決して行わないこと。説明(1)customerFormのフィールドである、jobをエスケープせず出力している。入力画面のJobフィールドに、<script>タグを入力する。Tag<script>タグとして認識され、ダイアログボックスが表示されてしまう。説明(1)EL式のf:h()を使用することにより、エスケープして出力している。入力画面のJobフィールドに<script>タグを入力する。<script>タグとして認識されず、入力値がそのまま出力される。-->Tipjava.util.Date継承クラスのフォーマットjava.util.Date継承クラスをフォーマットして表示する場合は、JSTLの<fmt:formatDate>を用いることを推奨する。以下に、設定例を示す。f:h()を使用して値を設定すると、Stringになってしまい、javax.el.ELExceptionがスローされるため、そのまま${form.date}を使用している。yyyyMMddにフォーマットするため、XSSの心配はない。Tipjava.lang.Number継承クラス、またはjava.lang.Numberにパースできる文字列java.lang.Number継承クラスまたはjava.lang.Numberにパースできる文字列をフォーマットして表示する場合は、<fmt:formatNumber>を用いることを推奨する。以下に、設定例を示す。付け忘れることを予防するため、f:h()を明示的に使用している。Escaping¶XSSの脆弱性への対応としては、JavaScript特殊文字をエスケープさせることが基本である。外部からの入力をもとに、JavaScriptの文字列リテラルを動的に生成する場合に、エスケープが必要となる。エスケープが必要なJavaScriptの特殊文字の例と、エスケープ後の例は、以下のとおりである。出力値をエスケープしない脆弱性のある例¶XSS問題が発生する例を、以下に示す。Attack!');</script><\/script>上記例のように、ユーザーの入力を導出元としてコードを出力するなど、JavaScriptの要素を動的に生成する場合、意図せず文字列リテラルが閉じられ、XSSの脆弱性が生じる。任意のスクリプトが埋め込まれてしまう可能性があるため、別の方式を検討する、または、極力避けるべきである。出力値をf:js()関数でエスケープする例¶XSSを防ぐために、ユーザの入力値、が設定される値にEL式の関数、f:js()の使用を推奨する。使用例を、下記に示す。説明(1)EL式のf:js()を使用することにより、エスケープして変数に設定している。イベントハンドラの値をエスケープする場合、f:h()や、f:js()を使用するのではなく、f:hjs()を使用すること。${f:h(f:js())}と同義である。文字参照形式にエスケープ後、HTMLエスケープを行う必要がある。出力値をエスケープしない脆弱性のある例¶XSS問題が発生する例を、以下に示す。//上記の値が設定されてしまうことで、意図せず文字列リテラルが閉じられ、XSSの脆弱性が生じる。マウスオーバ時、XSSのダイアログボックスが表示されてしまう。使用例を、下記に示す。説明(1)EL式のf:hjs()を使用することにより、エスケープして引数としている。マウスオーバ時、XSSのダイアログは出力されない。