2021年2月19日金曜日

動的アクションの非表示のセキュリティ上の効果について

ブラウザでJavaScriptコンソールを開き、APIを実行することにより、画面上から隠されている機能を実行できることについて解説します。

動作を確認するためにアプリケーションを作成します。EMP/DEPTのサンプル・データセットを使用します。

最初に空のアプリケーションを作成します。名前は任意です。今回はJavaScript API実行としました。表EMPの対話モード・レポートとフォームのページを追加します。ページの作成を開始します。

フォームからフォーム付きレポートを選びます。ページ属性の設定では、レポート・タイプ対話モード・レポートフォーム・ページ・モード標準を選びます。それ以外の設定は任意です。に進みます。


ナビゲーションのプリファレンス新規ナビゲーション・メニュー・エントリの作成を選び、に進んで、データ・ソースとしてローカル・データベース表/ビューの名前としてEMP (表) を選びます。に進みます。


フォーム・ページの設定で、主キー列としてEMPNO (Number) を選択し、作成をクリックします。


ページが作成されたら、フォームのページをページ・デザイナで開きます。


フォームのページが開く際に、ページ・アイテムP3_SALとボタンDELETEを非表示にする動的アクションを定義します。左ペインで動的アクション・ビューを開き、ページのロード上で動的アクションの作成を実行します。


動的アクションの名前ページ初期化とし、Trueアクションをふたつ定義します。


作成するTrueアクションは、ひとつはアクション非表示影響を受ける要素選択タイプアイテムアイテムとしてP3_SALを指定します。


もうひとつは、影響を受ける要素選択タイプボタンボタンとしてDELETEを指定します。


以上で確認のためのアプリケーションの準備が完了しました。

アプリケーションを実行し、作成した対話モード・レポートを開きます。ブラウザの開発ツールであるJavaScriptコンソールも開きます。


従業員の誰かを対象にフォームを開きます。動的アクションが実行され、ページ・アイテムP3_SALおよびボタンDELETEが表示されていないことが確認できます。


JavaScriptコンソールより、以下のコマンドを実行します。
$x_Show("P3_SAL");
ページ・アイテムP3_SALが表示されます。


続いて、以下のコマンドを実行します。
apex.submit("DELETE");

行の削除が実行され、レポート・ページに戻ります。


アプリケーションの利用者が、ブラウザの開発ツールからJavaScriptのAPIを直接実行することを止める方法はありません。

画面上に表示してはいけない情報は、認可、またはサーバー側の条件といった、サーバー側でページを生成する際に適用される条件を使用すれば、HTML自体が生成されなくなるため、JavaScript APIを呼び出しても表示されることはありません。


フォームと対話グリッドのAttributesに含まれる実行可能な操作、許可された行操作列、認可の編集を適切に設定していれば、JavaScriptコンソールからAPIを実行しても、表の操作は行われません。


対応策は以上になります。Oracle APEXのアプリケーション開発の一助になれば幸いです。