2020年6月25日木曜日

特定のページへの直リンクによるアクセス(1) - はじめに

Oracle APEXのアプリケーションでは、アプリケーションに含まれるページに直接アクセスすることは、デフォルトでは許可されていません。いくつかの属性を変更することによりセキュリティ上の保護を解除することで、直リンクを有効にする方法について説明します。

以下のトピックを予定しています。
  1. はじめに - 検証に使用するアプリケーションの作成
  2. ページの保護について
  3. 直リンクの少し凝った設定
  4. 補足
これらの保護はデフォルトですべて有効なので、セキュリティ上の保護を緩めるつもりがなければ、設定を変更する必要はありません。

以下のようなタスク詳細のページを、タスクのIDを引数として含んだURLから開く実装を行います。


直接アクセスをするURLは以下を想定しています。

簡易URLがONの場合
簡易URLがOFFの場合

Oracle APEX 20.1から簡易URL(Friendly URLs)の機能が追加され、直リンクのためのURLの形式がより一般的になりました。新規アプリケーションの場合デフォルトでONですが、特に直リンクを扱うアプリケーションでは積極的に利用したい機能です。簡易URLの設定はアプリケーション設定のプロパティに含まれています。


承認などを求める電子メールの通知に、その作業を行うページへのリンクを埋め込みたい、という要件より、直リンクの実装が求められることが多いです。

現在の簡易URLの実装には、ひとつ問題が見つかっています。ディープ・リンクを有効にするとチェックサムによる保護が設定にかかわらず無効になります。ディープ・リンクを機能させるにはチェックサムによる保護を解除する必要があるので実用上の問題はありませんが、注意が必要です。実際には、チェックサムの保護が有効のまま運用していて、Oracle APEXのバージョンが上がって問題が修正されると、今まで動いていた直リンクでエラーが発生するようになる、というのが発生しそうなケースとして考えられます。

それでは、これから直リンクの確認に使うアプリケーションを作成します。

クイックSQLを使って表を作成します。SQLワークショップからユーティリティに含まれるクイックSQLを実行します。左の簡易表定義に以下を指定します。
tasks
  name
  detail
  start_date
  end_date
  status
DDLの生成オプション設定を開いて指定します。オブジェクト接頭辞としてtest主キートリガーおよび順序経由を選択します。その後、変更の保存を行います。


挿入の生成は、表ディレクティブ/insertが指定されているときに機能し、ONにすると/insertの指定にしたがってサンプル・データを投入するinsert文を生成します。今回は表デイレクティブとして/insertの指定は含んでいないため、ONでもOFFでも結果は変わりません。

設定を行なってから、SQLの生成を実行し、生成されたSQLのスクリプトの保存を行なった後、レビューおよび実行を行います。


SQLスクリプトの保存時に指定するファイル名は任意です。後の手順で参照されることはありません。レビューおよび実行をクリックしたのちに表示される画面ではアプリケーションの作成ではなく、実行をクリックし表、順序およびトリガーの作成のみを行います。


次に表示される確認画面では即時実行をクリックします。スクリプトの実行結果として3行成功していれば、実装に使用する表は完成です。


次に空のアプリケーションを作成します。アプリケーション・ビルダーの画面を開き、作成をクリックします。


新規アプリケーションをクリックします。


名前だけを指定して(ここではサンプルタスク管理としています)、アプリケーションの作成を実行します。


これで空のアプリケーションが作成されました。先ほど作成した表TEST_TASKSの内容を一覧するレポートとそれぞれのタスクの詳細を表示するフォームを生成します。ページの作成を実行します。


コンポーネントフォームをクリックすると、次に進みます。


フォーム付きレポートをクリックすると、次に進みます。

フォーム付きレポートの作成を行うウィザードが開始されます。ページ属性として、レポート・タイプ対話モード・レポートレポート・ページ名タスク一覧フォーム・ページ名タスク詳細フォーム・ページ・モード標準とします。フォーム・ページ・モードがモーダル・ダイアログであるページは直リンクでのアクセスは不可ですので、必ず標準にします。レポート・ページ番号、フォーム・ページ番号はそれぞれ2、3になるはずですが、一度ウィザードをキャンセルしているとページ番号が進むことがあります。ページ番号は後続の説明で参照されるので、その場合は2、3に変更してください。ブレッドクラムBreadcrumbを選択し、エントリ名はデフォルトでタスク一覧が設定されます。以上を設定して、へ進みます。


ナビゲーションのプリファレンスとして新規ナビゲーション・メニュー・エントリの作成を選択すると、新規ナビゲーション・メニュー・エントリとしてタスク一覧が設定されます。この設定により、アプリケーションの左に表示されるメニューに、今作成しているレポート・ページを呼び出すエントリが追加されます。に進みます。


データ・ソースがローカル・データベース、ソース・タイプが表であること(これらがデフォルト)を確認し、表/ビューの名前としてTEST_TASKSを選択します。デフォルトですべての列が表示する列に選択されるので、そのままへ進みます。


フォームの設定です。こちらもデフォルトですべての列が表示する列に選択されるので、それは変更せず、主キー型主キー列の選択とし、主キー列ID(Number)を選びます。ウィザードによる設定はこれで完了です。作成をクリックします。


レポートのページとフォームのページが作成され、編集画面であるページ・デザイナが開きます。右上のページの保存と実行をクリックし、作成したアプリケーションを実行します。


ログイン画面が表示されるので、ワークスペースのサインイン時に使用したユーザー名とパスワードでサインインします。


作成したレポート画面が表示されます。別の画面が表示される場合は、左上にあるハンバーガーのアイコンをクリックしナビゲーション・メニューを開いて、タスク一覧を選択します。データを一行挿入するために作成をクリックします。


フォームの内容を埋めて(任意で構いません)、作成をクリックします。


データが挿入されるとレポートに表示が戻ります。主キーであるIDは 1 が設定されていることが確認できます。(何度も操作していると1より大きくなります)

編集アイコンをクリックすると、対象タスクの詳細画面を表示されます。この画面を直接URLで指定して開こう、というのがこの記事のテーマです。


その前に2点ほど、設定の調整をします。

アプリケーション定義の編集を開き、URLに日本語が含まれないように、アプリケーションの別名を英数字に変更します。ここではdemo-tasks(ハイフンはOK)としています。


また、タスク詳細のページを開き、ページの別名taskへ変更します。


このように変更したのち、再度、登録したタスクの詳細を開きます。ブラウザに表示されるURLは以下のようになります。
https://apex.oracle.com/pls/apex/japancommunity/r/demo-tasks/task?p3_id=1&clear=RP&session=708433516570720&cs=3uY1cC2Q1Zgb3GRwlPd5NNHX49MTHJ7kZvXJo4JihNORTgbDCzh6E5nHK52QifSBjZjrXzhpvTeOqJLU2Ou7zZA
URLには4つのパラメータが含まれています。p3_idは表示対象となるタスクのIDです。(p3_idではなくidという引数名にあとで変更します)これは必要なパラメータです。clearはフォームを初期化しなさい、という指定です。直リンクの場合は常にフォームは初期状態でアクセスされることより、指定は不要なパラメータです。

sessionはセッションが開始して初めて有効な値です。直リンクによるアクセスではセッションは開始していないため、有効なsessionをあらかじめ与えることはできません。cs(チェックサム)には生成方法にいくつかの種類がありますが、p3_idはチェックサムによって保護されているので、p3_idに与える値を変更するときはチェックサムも同時に更新する必要があります。

これからは、これらの設定によって行われているセキュリティ上の保護の説明と、それをどのように外すかについて説明していきます。