前へ
前へ
 
次へ
次へ

クロスサイト・スクリプティング保護の理解

クロスサイト・スクリプティング(XSS)は、動的に生成されるWebページを利用するセキュリティ攻撃です。XSS攻撃では、ユーザーのブラウザに読み込まれたときにアクティブになるスクリプトがWebアプリケーションに送信されます。これらのスクリプトがアクティブになると、データまたは場合によってはセッション資格証明が盗まれ、それらの情報が攻撃者に送信される可能性があります。

悪意のあるコードがOracle Application Expressアプリケーションに侵入すると、通常のページ・レンダリング時に、そのコードがアプリケーション内のHTMLリージョンや他の場所にレンダリングされる可能性があります。セッション・ステートへの不正なコードの挿入を阻止するため、Application Expressエンジンは特定の場合に文字をエスケープします。

トピック:

HTMLリージョンなどの静的領域の保護

HTMLリージョンなどの静的表示領域では、&ITEM.表記法を使用してセッション・ステートを参照できます。静的表示領域の例には、HTMLリージョン、ページのヘッダーとフッター、リージョンのヘッダーとフッター、リージョン・タイトル、ボタン・ラベル、ヘルプ・テキスト、フォーム・アイテム・ラベルおよび要素の後のテキスト、テンプレート、(フィールド・テキストの前後の)ラジオ・グループ、イベント成功メッセージ、イベント・エラー・メッセージ、ナビゲーション・バー属性、アプリケーション静的置換文字列値、チャート・ラベルおよび凡例、ブレッドクラムおよびリスト・フレーム・テキスト、カレンダ・テキスト、ラベル、凡例などがあります。

安全なアイテム表示タイプについて

セッション・ステートがこのように参照される場合、ページに表示される値には、参照されるアイテムに次の安全なアイテム表示タイプのいずれかが含まれている場合にエスケープされる特殊文字(<>&")が含まれません。

  • テキストとして表示(状態は保存しない)

  • テキストとして表示(特殊文字をエスケープし、状態は保存しない)

  • テキストとして表示(LOVに基づき、状態は保存しない)

  • テキストとして表示(PL/SQLに基づき、状態は保存しない)

  • テキスト・フィールド(無効、状態を保存しない)

  • HTML表の停止および開始(ラベルのみ表示)

参照されるアイテムに前述のタイプ以外の表示タイプが含まれている場合、ページに表示される値には、エスケープされる特殊文字が含まれます。また、アプリケーション・レベルのアイテムには、安全な表示タイプが含まれているとみなされますが、実際にフォーム・アイテムに含まれているような表示プロパティは含まれていません。

値をエスケープするかどうかを決定するために使用されるルールについて

Application Expressエンジンは、事前定義済のスマート・エスケープ・ルールを使用して、セッション・ステートからフェッチされた値をエスケープするかどうか、およびいつそれを実行するかを決定します。

このルールを使用するのは、前にリストした表示タイプを使用したアイテムは、通常フィルタ処理(エスケープ)されずにブラウザに表示されることを意図したHTMLを含むテキスト用であるためです。安全に行われる方法は、これらのタイプのアイテムが常にエスケープされてアプリケーションに入力されるルールを実施する以外にありません。たとえば、ユーザーが、Oracle Application Expressのf?p URL構文を使用して、一部のテキストを安全なアイテムに渡す場合、Application Expressエンジンは値をセッション・ステートに保存する際に特殊文字をエスケープします。これにより次の2つの結果が予想されます。

  1. 値に特殊文字が含まれていなかった場合、渡された値は指定されたとおりにセッション・ステートに保存される。

  2. 値に特殊文字が含まれていた場合、値をセッション・ステートに保存する際に特殊文字をエスケープする。

いずれの状況でも、アイテムは、現在、前述のHTMLリージョンなどの静的領域で&ITEM.表記法を使用して安全に参照できます。

安全なアイテム・タイプを使用したHTMLマークアップの保持および表示

前にリストした安全なアイテム・タイプを使用して、ブラウザにHTMLマークアップを保持および表示します。たとえば、安全なページ・アイテムP1_XXX&P1_XXXを使用)を参照して、太字で一部のテキストをレンダリングする要件があるとします。アイテムP1_XXXには次のHTMLが含まれているとします。

<b>ABABABAB</b>

実行するには、アプリケーション・コントロール(計算、プロセス、アイテムのソース式、アイテムのデフォルト値など)を使用して、値をこれらの安全なアイテムに格納します。値をこのように挿入する場合は、コンテンツの安全性を確認します。これらの方法を使用する場合、Application Expressエンジンは、値をセッション・ステートに保存する際に特殊文字をエスケープしません。

安全なアイテムの安全性は、最終的に、アイテムがページにポストされず、ページ送信の一部としてApplication Expressエンジンに発行されないルールによって確認されます。

動的出力の保護

htp.pなどの方法を使用してセッション・ステートからフェッチし、レンダリングするアイテムは、必要に応じてコードで明示的にエスケープする必要があります。たとえば、ページ上のPL/SQL動的コンテンツ・リージョンで次のhtp.pを使用するとします。

 htp.p(v('SOME_ITEM'));

セッション・ステートからフェッチするアイテムの値に予期しないタグやスクリプトが含まれる可能性がある場合は、リージョンで次のhtp.pを使用できます。

htp.p(htf.escape_sc(v('SOME_ITEM'))); 

ただし、フェッチする値を安全にレンダリングできることが確かな場合は、この値をエスケープする必要はありません。開発者は、出力をエスケープしない方が適切な場合を判断する必要があります。

次のように、このルールに従うことをお薦めします。

これを行うのは、開発者としてハッカーが悪意ある値を安全ではないアイテムにポストするのを防ぐ方法はないためです。アプリケーションがこれらのアイテムを一般ユーザーに見えるように表示しなくても、このルールに従わないと、ハッカーはアプリケーションを使用してXSS攻撃をマウントできることに注意してください。

レポート・リージョンの保護

Application Expressエンジンは、レポートのボディでレンダリングされるデータをエスケープします。レポートのヘッダーおよびメッセージにおけるセッション・ステートへの参照は、安全なアイテム・タイプの値はエスケープされず、その他のアイテム・タイプの値はエスケープされるように、スマート・エスケープ・ルールを使用してセッション・ステートからフェッチされます。

フォーム・アイテムの保護

ブラウザに送信されるフォーム・ページの生成中に、フォーム・アイテム(隠しアイテムなど)が値を取得する場合、結果テキストはレンダリング前にエスケープされます。一部の安全なアイテム・タイプは、各表示タイプの意図する動作をサポートするため、このルールにおける例外となります。