セキュリティに関する開発者のベスト・プラクティスには、パスワード・アイテム・タイプの構成、問題を引き起こす可能性のあるパスワード・アイテムの識別、「セキュリティ・プロファイル」レポートの表示、クロスサイト・スクリプティング保護の理解、セッション・ステートの管理、URL改ざんの防止およびファイルのアップロードの保護が含まれます。
親トピック: アプリケーション・セキュリティの管理
パスワード・アイテムは、Webブラウザ画面に入力されたテキストを表示しません。パスワード・アイテムを作成する場合は、セッション・ステートを保存しないパスワード属性を使用して、パスワードがセッション・ステート表のデータベースに保存されないようにすることをお薦めします。
設定可能なパスワード・アイテム・タイプ属性は、次のとおりです。
必須の値: 「はい」に設定し、ページ・アイテムが表示されている場合、Oracle Application Expressでは、ページの送信時にNOT NULL検証が自動的に実行されます。「いいえ」に設定すると、検証が行われず、NULL値が受け入れられます。
[Enter]を押すと送信: 「はい」に設定した場合、ユーザーがフィールドで[Enter]キーを押すと、ページが送信されます。
状態を保存しない: 「はい」に設定すると、パスワードがセッション・ステートに保存されません。セキュリティ上の理由により、この属性は常に「はい」に設定する必要があります。「いいえ」に設定する場合は、「セッション・ステートに暗号化された値を保存」属性を「はい」に設定することを考慮してください。
認可スキーム: オプションで認可スキームを選択します。このコンポーネントをレンダリングまたは処理するためには、この認可スキームがTRUEと評価される必要があります。
セッション・ステート保護: この属性を「制限なし」または「制限付き」に設定して、セッション・ステート保護のレベルを選択できます。
制限なし: URLまたはフォームでアイテムを渡して、アイテムを設定できます。URLにチェックサムは必要ありません。
制限付き: アイテムをブラウザから設定することはできません。アイテムの値を内部プロセス、計算などに設定できる方法を制限する場合は、このオプションを使用します。この属性は、データ・エントリ・アイテムとして使用できないアイテムのみに適用され、「セッション・ステート保護」が無効になっていても常に監視されます。
セッション・ステートに暗号化された値を保存: 機密のセッション・ステートは、Application Expressセッション・ステート管理表に格納するときに暗号化することができます。このアイテムの暗号化されたセッション・ステートを保持するには、この値を「はい」に設定します。詳細は、セッション・ステートおよびセキュリティについてを参照してください。
親トピック: セキュリティに関する開発者のベスト・プラクティスの理解
問題を引き起こす可能性のあるパスワード・アイテムを識別するには、「セキュリティ・プロファイル」および「パスワード・アイテム」レポートを使用します。
問題を引き起こす可能性のあるパスワード・アイテムは、次のいずれかです。
セッション・ステートを保存しないパスワード・アイテム・タイプを1つも使用しないもの。
セッション・ステートに暗号化された値を格納します。
「セキュリティ・プロファイル」レポートを表示するには、次のステップを実行します。
親トピック: 問題を引き起こす可能性のあるパスワード・アイテムの識別
問題を引き起こす可能性のあるパスワード・アイテムを識別するには、次のステップを実行します。
ヒント:
パスワード・アイテムを含むページで、ページ属性「フォームのオートコンプリート」を「オフ」に設定します。この属性を「オフ」に設定すると、Webブラウザによって、ページでアイテムのオートコンプリートが試行されなくなります。
親トピック: 問題を引き起こす可能性のあるパスワード・アイテムの識別
クロスサイト・スクリプティング・セキュリティ攻撃からアプリケーションを保護するためのベスト・プラクティスについて学習します。
親トピック: セキュリティに関する開発者のベスト・プラクティスの理解
クロスサイト・スクリプティング(XSS)は、動的に生成されるWebページを利用するセキュリティ攻撃です。XSS攻撃では、ユーザーのブラウザに読み込まれたときにアクティブになるスクリプトがWebアプリケーションに送信されます。これらのスクリプトがアクティブになると、データまたは場合によってはセッション資格証明が盗まれ、それらの情報が攻撃者に送信される可能性があります。
悪意のあるコードがOracle Application Expressアプリケーションに侵入すると、通常のページ・レンダリング時に、そのコードがアプリケーション内のHTMLリージョンや他の場所にレンダリングされる可能性があります。セッション・ステートへの不正なコードの挿入を阻止するため、Application Expressエンジンは特定の場合に文字をエスケープします。
親トピック: クロスサイト・スクリプティング保護の理解
HTMLリージョンなどの静的表示領域を保護する方法について学習します。
親トピック: クロスサイト・スクリプティング保護の理解
HTMLリージョンなどの静的領域では、置換文字列を使用してセッション・ステートを参照できます。テンプレート内で使用可能な特別な置換文字列は、シャープ記号(#)で示します(例: #ABC#
)。ページまたはアプリケーション・アイテムを参照するには、&ITEM.
表記法を使用します。
静的表示領域の例には、HTMLリージョン、ページのヘッダーとフッター、リージョンのヘッダーとフッター、リージョン・タイトル、ボタン・ラベル、ヘルプ・テキスト、フォーム・アイテム・ラベルおよび要素の後のテキスト、テンプレート、(フィールド・テキストの前後の)ラジオ・グループ、イベント成功メッセージ、イベント・エラー・メッセージ、ナビゲーション・バー属性、アプリケーション静的置換文字列値、チャート・ラベルおよび凡例、ブレッドクラムおよびリスト・フレーム・テキスト、カレンダ・テキスト、ラベル、凡例などがあります。
開発者は、感嘆符(!
)の後に事前定義済のフィルタ名を続けたものをページまたはアプリケーション・アイテム名、あるいはレポート列参照に追加して、置換値内の特殊文字をエスケープできます。
関連項目:
親トピック: HTMLリージョンなどの静的領域の保護
セッション・ステートがこのように参照される場合、ページに表示される値には、参照されるアイテムが「表示のみ」で「セッション・ステートの保存」属性が「いいえ」、および特殊をエスケープが「いいえ」に設定されている場合にエスケープされる特殊文字(<
、>
、&
、"
)が含まれません。
参照されるアイテムに「セッション・ステートの保存」属性が「いいえ」に設定されている「表示のみ」以外の表示タイプが含まれている場合、ページに表示される値には、エスケープされる特殊文字が含まれます。また、アプリケーション・レベルのアイテムには、安全な表示タイプが含まれているとみなされますが、実際にフォーム・アイテムに含まれているような表示プロパティは含まれていません。
関連項目:
親トピック: HTMLリージョンなどの静的領域の保護
Application Expressエンジンは、事前定義済のスマート・エスケープ・ルールを使用して、セッション・ステートからフェッチされた値をエスケープするかどうか、およびいつそれを実行するかを決定します。
このルールを使用するのは、前にリストした表示タイプを使用したアイテムは、通常フィルタ処理(エスケープ)されずにブラウザに表示されることを意図したHTMLを含むテキスト用であるためです。安全に行われる方法は、これらのタイプのアイテムが常にエスケープされてアプリケーションに入力されるルールを実施する以外にありません。たとえば、ユーザーが、Oracle Application Expressのf?p URL構文を使用して、一部のテキストを安全なアイテムに渡す場合、Application Expressエンジンは値をセッション・ステートに保存する際に特殊文字をエスケープします。これにより次の2つの結果が予想されます。
値に特殊文字が含まれていなかった場合、渡された値は指定されたとおりにセッション・ステートに保存される。
値に特殊文字が含まれていた場合、値をセッション・ステートに保存する際に特殊文字をエスケープする。
いずれの状況でも、アイテムは、現在、前述のHTMLリージョンなどの静的領域で&ITEM.
表記法を使用して安全に参照できます。
親トピック: HTMLリージョンなどの静的領域の保護
前にリストした安全なアイテム・タイプを使用して、ブラウザにHTMLマークアップを保持および表示します。たとえば、安全なページ・アイテムP1_XXX
(&P1_XXX
を使用)を参照して、太字で一部のテキストをレンダリングする要件があるとします。アイテムP1_XXX
には次のHTMLが含まれているとします。
<b>ABABABAB</b>
実行するには、アプリケーション・コントロール(計算、プロセス、アイテムのソース式、アイテムのデフォルト値など)を使用して、値をこれらの安全なアイテムに格納します。値をこのように挿入する場合は、コンテンツの安全性を確認します。これらの方法を使用する場合、Application Expressエンジンは、値をセッション・ステートに保存する際に特殊文字をエスケープしません。
安全なアイテムの安全性は、最終的に、アイテムがページにポストされず、ページ送信の一部としてApplication Expressエンジンに発行されないルールによって確認されます。
親トピック: HTMLリージョンなどの静的領域の保護
htp.p
などの方法を使用してセッション・ステートからフェッチし、レンダリングするアイテムは、必要に応じてコードで明示的にエスケープする必要があります。たとえば、ページ上のPL/SQL動的コンテンツ・リージョンで次を使用するとします。
htp.p(v('SOME_ITEM'));
セッション・ステートからフェッチするアイテムの値に予期しないタグやスクリプトが含まれる可能性がある場合は、リージョンで次を使用できます。
htp.p(apex_escape.html(:SOME_ITEM));
ただし、フェッチする値を安全にレンダリングできることが確かな場合は、この値をエスケープする必要はありません。開発者は、出力をエスケープしない方が適切な場合を判断する必要があります。
次のように、このルールに従うことをお薦めします。
アイテムが安全なタイプでないかぎり、エスケープせずにセッション・ステートからフェッチされたアイテムを表示しないでください。
これを行うのは、開発者としてハッカーが悪意ある値を安全ではないアイテムにポストするのを防ぐ方法はないためです。アプリケーションがこれらのアイテムを一般ユーザーに見えるように表示しなくても、このルールに従わないと、ハッカーはアプリケーションを使用してXSS攻撃をマウントできることに注意してください。
関連項目:
親トピック: クロスサイト・スクリプティング保護の理解
Application Expressエンジンは、レポートのボディでレンダリングされるデータをエスケープします。レポートのヘッダーおよびメッセージにおけるセッション・ステートへの参照は、安全なアイテム・タイプの値はエスケープされず、その他のアイテム・タイプの値はエスケープされるように、スマート・エスケープ・ルールを使用してセッション・ステートからフェッチされます。
Oracle Application Expressでは、列の「特殊文字をエスケープ」属性が「はい」に設定されている場合、レポート列のHTML特殊文字が自動的にエスケープされます。プレーン列値のかわりにHTMLフラグメントをレンダリングする必要がある場合(たとえば、ハイライトのために)、(「特殊文字をエスケープ」の使用を妨げる)問合せ自体でのHTMLフラグメントの連結を行わずに、レポート列の「HTML式」属性を使用する必要があります。「HTML式」属性で、静的HTMLを入力し、#COLUMN#
表記法を使用してエスケープされた列値を埋め込むことができます。拡張された列表記法により、Oracle Application Expressが列値をエスケープする方法を制御できます。
#COLUMN!HTML#
- 予約済のHTML文字をエスケープします。
#COLUMN!ATTR#
- HTML属性のコンテキストで予約済の文字をエスケープします。
#COLUMN!JS#
- JavaScriptのコンテキストで予約済の文字をエスケープします。
#COLUMN!RAW#
- 元のアイテム値を保持し、文字をエスケープしません。
#COLUMN!STRIPHTML#
- HTMLタグを出力から削除し、予約済のHTML文字をエスケープします。
たとえば、次の問合せに基づくレポートがあるとします。
SELECT empno, ename, NULL DELETE_LINK FROM emp
この例では、すべての列がエスケープされます。「HTML式」をDELETE_LINK
で次のように定義できます。
<a href="javascript:if (confirm('Do you really want to delete #ENAME!JS#?')) doSubmit('DELETE-#EMPNO#');">Delete</a>
この例では、従業員を削除するかどうかを確認するリンクがレンダリングされ、ユーザーが確認した場合は、行を削除するリクエストが送信されます。#ENAME!JS#
ではなく#ENAME#
を使用した場合、O'Neillのような名前は構文エラーの原因となり、攻撃者は不適切なエスケープをクロスサイト・スクリプティングに利用できます。
親トピック: クロスサイト・スクリプティング保護の理解
ブラウザに送信されるフォーム・ページの生成中に、フォーム・アイテム(隠しアイテムなど)が値を取得する場合、結果テキストはレンダリング前にエスケープされます。一部の安全なアイテム・タイプは、各表示タイプの意図する動作をサポートするため、このルールにおける例外となります。
一部のアイテム・タイプには、「特殊文字をエスケープ」セキュリティ属性があります。「特殊文字をエスケープ」属性を使用して、値をエスケープするかどうかを指定します。デフォルトでは「はい」に設定されています。HTMLコードを表示する場合は、この属性を「いいえ」に設定します。
開発者は、感嘆符(!
)の後に事前定義済のフィルタ名を続けたものをページまたはアプリケーション・アイテム名、あるいはレポート列参照に追加して、置換値内の特殊文字をエスケープできます。
関連項目:
親トピック: クロスサイト・スクリプティング保護の理解
ユーザーがアイテムに入力できる文字を制限することで、クロスサイト・スクリプティングおよびその他のインジェクション攻撃を制限できます。これを行うためには、「ページ・アイテムの編集」ページの「セキュリティ」リージョンで「制限付き文字」属性を使用します。「制限付き文字」はセッション・ステートに保存できます。使用可能なオプションは次のとおりです。
- すべての文字を許可 -
制限は適用されません。
a-Z、0-9と空白のホワイトリスト
文字a-z、A-Z、0-9および空白のみ許可されます。
ブラックリストHTMLコマンド文字(<>")。
予約済のHTML文字は許可されません。
ブラックリスト&<>"/;,*|=%および--
&、<、>、"、/、;、","、*、|、=、%および"--" (PL/SQLコメント)は許可されません。
ブラックリスト&<>"/;,*|=%または--と改行
&、<、>、"、/、;、","、*、|、=、%、"--"、および改行文字は許可されません。
制限を選択する場合、選択された文字制限に一致しないデータをユーザーが保存しようとすると、Oracle Application Expressからエラー・メッセージが表示されます。
関連項目:
親トピック: クロスサイト・スクリプティング保護の理解
セッション・ステートおよびセキュリティの管理について学習します。
Oracle Application Expressは、データベース表にセッション・ステートを保持します。セッション・ステートがデータベース表で保持されるのは、サーバー側にセッション・ステートを格納すると、クライアント側に格納する場合よりセキュアになるためです。Oracle Application ExpressアプリケーションはステートレスHTTPプロトコルを使用するため、複数のページ・ビューにわたるアプリケーションのセッション・ステートがデータベース表に保持されます。各Oracle Application Expressアプリケーション・ユーザーの同期データベース接続を保持しない場合は、メモリーおよびデータベース・リソースの要件が大幅に削減されます。
開発者は、アプリケーション・ビルダーおよび組込みの監視ページを使用して、Oracle Application Expressアプリケーションによって格納されたセッション・ステートを問い合せることができます。開発者および管理者は、認証されているワークスペースのアプリケーションにアクセスできます。
セッション・ステートの管理に関する開発者向けのベスト・プラクティスには、次のものが含まれます。
プログラムの制御フローの標準的な実装の一環として、クリア・キャッシュ・ページ・プロセスまたはページへのナビゲートに使用されるURLのクリア・キャッシュ・ディレクティブを使用して不要な値のセッション・ステートを消去します。
ステートを保存しないパスワード・ページ・アイテム・タイプを使用します。これを使用すると、入力したパスワードがデータベースのセッション・ステート表に保存されません。
セッションに機密データを保持する必要がある場合は、Oracle Application Expressのセッション・ステート表に暗号化した形式で保存する必要があります。この機能を使用するには、ページ・アイテムの「セッション・ステートに暗号化された値を保存」属性を「はい」に設定します。暗号化されて保存された値は、読取り時に自動的に複合化されます。
注意:
暗号化されたセッション・ステートの目的は、Oracle Application Expressのセッション・ステート表、デバッグ出力またはデータベース・データファイルへのアクセス権を持っている可能性のある他のOracle Application Express開発者やデータベース管理者に、暗号化された値が読み取られないようにするセッション・ステートを保持することです。データベースのバックアップを行う際は、バックアップ・ファイルでデータを暗号化する機能を使用することをお薦めします。
ヒント:
アイテム値は、最大で4000バイト長まで暗号化できます。4000バイトを超える値を暗号化しようとすると、エラー・メッセージが表示されます。
親トピック: セキュリティに関する開発者のベスト・プラクティスの理解
セッション・ステート保護は、ハッカーがアプリケーション内のURLを改ざんするのを防ぐための組込み機能です。URL改ざんにより、プログラム・ロジック、セッション・ステートの内容および情報プライバシが悪影響を受ける可能性があります。
セッション・ステート保護を有効にすると、「ページ・アクセス保護」属性と「セッション・ステート保護」項目属性が、f?p=
URL内に配置されたチェックサムとともに使用され、URL改ざんと、セッション・ステートに対する権限のないアクセスおよび変更が防止されます。セッション・ステート保護を無効にすると、セッション・ステート保護に関連するページ属性および項目属性が無視され、生成されるf?p=
URLにはチェックサムが含まれません。
親トピック: URL改ざんの防止
セッション・ステート保護は、セキュリティ属性の編集ページまたはセッション・ステート保護ページから有効にできます。
セッション・ステート保護は2ステップのプロセスで有効にします。最初に、この機能を有効にします。次に、ページおよびアイテムのセキュリティ属性を設定します。これらのステップは、ウィザードを使用して実行するか、セッション・ステート保護ページでページおよびアイテムのセキュリティ属性を手動で設定して行います。
セキュリティ属性の編集ページからセッション・ステート保護を有効にするには、次のステップを実行します。
ヒント:
セッション・ステート保護を無効にするには、同じステップを再度実行しますが、「有効」のかわりに「無効」を選択します。セッション・ステート保護を無効にしても、既存のセキュリティ属性の設定は変更されませんが、それらの属性は実行時に無視されます。
親トピック: セッション・ステート保護の有効化
セッション・ステート保護を有効にすると、カレント・アプリケーションへのブックマーク・リンクが機能するかどうかに影響します。次の規則を考慮してください。
セッション・ステート保護を有効にした後に作成したブックマーク・リンクは、ブックマーク・リンクにチェックサムが含まれている場合に機能します。
セッション・ステート保護を有効にする前に作成したブックマーク・リンクは、ブックマーク・リンクにチェックサムが含まれている場合は機能しません。
チェックサムが含まれていないか、または不要なチェックサムが含まれているブックマークは、セッション・ステート保護の影響を受けません。
ページ・レンダリング時、Application Expressエンジンは、計算中に非表示のアプリケーション属性(チェックサムsalt)を使用し、f?p
URLに含まれているチェックサムを確認します。セッション・ステート保護を有効にすると、Application Expressエンジンにチェックサムが含まれます。チェックサムsalt属性を再設定するには、セキュリティ属性の編集ページで「ブックマークの無効化」をクリックします。
ヒント:
「ブックマークの無効化」,をクリックすると、アプリケーションへのアクセスに使用されるブックマークURLは、このアプリケーションに以前に生成されたチェックサムが含まれる場合は失敗するので注意してください。
ブックマークの無効化の確認ページで、ブックマーク・チェックサムの計算に使用されるハッシュ・アルゴリズムであるブックマーク・チェックサム・ファンクションを構成することもできます。
セッション・ステート保護を有効にするには、次のステップを実行します。
ヒント:
セッション・ステート保護を無効にするには、同じステップを実行しますが、「有効化」のかわりに「無効化」を選択します。セッション・ステート保護を無効にしても、既存のセキュリティ属性の設定は変更されませんが、それらの属性は実行時に無視されます。
親トピック: セッション・ステート保護の有効化
ヒント:
セキュリティ属性を構成する前に、まずセッション・ステート保護を有効にする必要があります。セッション・ステート保護の有効化を参照してください。
親トピック: URL改ざんの防止
セッション・ステート保護を有効にした後、セキュリティ属性を構成します。セキュリティ属性は2つの方法で構成できます。
ウィザードを使用し、特定の属性カテゴリの値を選択する。この場合、選択内容がアプリケーション内のすべてのページおよびアイテムに適用されます。
個々のページ、アイテムまたはアプリケーション・アイテムの値を構成する。
親トピック: セッション・ステート保護の構成
「セッション・ステート保護」ウィザードの最初のページでは、ページ、アイテムおよびアプリケーション・アイテムのセッション・ステート保護設定のサマリーを確認できます。
既存のセッション・ステート保護設定のサマリーを表示するには、次のステップを実行します。
親トピック: セッション・ステート保護の構成
ウィザードを使用してセッション・ステート保護を構成するときは、特定の属性カテゴリの値を設定します。この場合、選択内容がアプリケーション内のすべてのページおよびアイテムに適用されます。
ウィザードを使用してセッション・ステート保護を構成するには、次のステップを実行します。
親トピック: セッション・ステート保護の構成
ページのセッション・ステート保護を構成するには、次のステップを実行します。
関連項目:
「検索バーについて」
親トピック: セッション・ステート保護の構成
アイテムのセッション・ステート保護を構成するには、次のステップを実行します。
関連項目:
「検索バーについて」
親トピック: セッション・ステート保護の構成
アプリケーション・アイテムのセッション・ステート保護を構成するには、次のステップを実行します。
関連項目:
「検索バーについて」
親トピック: セッション・ステート保護の構成
ファイルのアップロードの保護に関する開発者向けのベスト・プラクティスについて学習します。
Oracle Application Expressを使用すると、ファイルをアップロードし、アップロードしたファイルにアクセスできるアプリケーションを簡単に作成できます。これらのファイルは、共通のファイル記憶域表にアップロードされます。データベース・ビューAPEX_APPLICATION_FILES
では、データベース・アカウント(またはワークスペース)に関連付けられたファイルが表示されますが、共通のファイル記憶域表へのプログラムを介したアクセスでは、認証が不要な場合もあり、アップロードされたファイルを他のユーザーが参照できます。
関連項目:
ファイル参照ページ・レベル・アイテムの作成の詳細は、「アイテム・タイプについて」を参照してください
親トピック: セキュリティに関する開発者のベスト・プラクティスの理解