2021年8月16日月曜日

データベース・セキュリティの活用(3) - テスト用アプリケーションの作成

 ワークスペースAPEXDEVにサインインし、テストに使用するアプリケーションを作成します。このアプリケーションには、意図的にSQLインジェクションに脆弱であるSQLを含めます。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前SQLインジェクションとします。アプリケーションの作成を実行します。


アプリケーションが作成されたら、ページ・デザイナホーム・ページ(ページ番号1)を開きます。


ホーム・ページにリージョンを3つ作成します。左ペインのレンダリング・ビューにあるContent Body上でコンテキスト・メニューを開き、リージョンの作成を実行します。

1つ目のリージョンは、識別名前従業員指定タイプ静的コンテンツとします。


従業員名を入力するページ・アイテムを作成します。Content Body以下のリージョン従業員指定の上でコンテキスト・メニューを開き、ページ・アイテムの作成を実行します。識別名前P1_ENAMEタイプテキスト・フィールドラベル従業員名設定[Enter]を押すと送信ONにします。


表HR.EMPを一覧するリージョンを作成します。リージョンの作成を実行し、識別タイトル従業員一覧 - 行の確認とし、タイプにはクラシック・レポートを選択します。ソース位置ローカル・データベースタイプSQL問合せSQL問合せとして以下を記述します。
SELECT * FROM HR.EMP WHERE ENAME = '&P1_ENAME.'
上記のSELECT文は文中に置換文字列&P1_ENAME.を含むため、SQLインジェクションに対して脆弱になっています。正しくはバインド変数:P1_ENAMEを使用します。今回はデータベースのセキュリティ機能の効果を確認するため、あえてこのようにしています。


もうひとつクラシック・レポートのリージョンを作成します。リージョンの作成を実行し、識別タイトル従業員一覧 - 列の確認とします。SQL問合せに以下を記述します。検索対象の列からSALおよびCOMMを除外しています。
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, DEPTNO FROM HR.EMP WHERE ENAME = '&P1_ENAME.'

これで表HR.EMPを一覧するページが完成しました。ページを実行し動作を確認します。

ワークスペースAPEXDEVにサインインしたユーザー(通常はAPEXDEV)にてサインインします。


従業員名SCOTTを入力してEnterを押します。SCOTTの情報がそれぞれのクラシック・レポートに1行だけ表示されています。


アプリケーションが従業員名として想定している入力は単一の従業員名です。別の従業員名を入力しても、レポートに表示されるのは1行のみです。

SQLインジェクションをシミュレートするため、従業員名として以下を入力します。

SCOTT' or '1' = '1

レポートにはすべての従業員の情報が一覧されます。


続いて、従業員名に以下を入力します。

SCOTT' UNION SELECT EMPNO, ENAME || ' - ' || SAL || ' - ' || COMM ENAME, JOB, MGR, HIREDATE, DEPTNO FROM HR.EMP WHERE '1'='1

レポートは列SALおよびCOMMを含んでいませんが、列ENAMEにSALおよびCOMMの情報が表示されています。


SQLインジェクションを確認するページは出来上がりました。

表HR.EMPを編集する対話グリッドのページを作成します。ページの作成を実行し、ページ作成ウィザードを起動します。


フォームを選択します。


編集可能対話グリッドを選択します。


ページ名従業員編集として、へ進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選びます。へ進みます。


データ・ソースローカル・データベース編集が有効ONとします。ソース・タイプとしてSQL問合せを選択し、SQL問合せとして以下のSQLを記述します。作成をクリックします。
SELECT ROWID, EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM HR.EMP

作成したページを実行すると、以下になります。従業員の挿入、更新、削除といった操作を行えます。


対話グリッドのページをもう一枚作成します。操作の流れは同じなので、異なる部分だけを示します。ページ作成ウィザードを起動し、編集可能対話グリッドを選択します。

ページ名部分編集とします。


SQL問合せからは列SALおよびCOMMを除いた以下のSQLを、SQL問合せとして記述します。作成をクリックします。
SELECT ROWID, EMPNO, ENAME, JOB, MGR, HIREDATE, DEPTNO FROM HR.EMP

作成されたページは以下になります。列SAL(Sal)とCOMM(Comm)が除かれています。


以上でテストに使用するアプリケーションが完成しました。

アプリケーションのエクスポートは以下に置いています。
https://github.com/ujnak/apexapps/blob/master/exports/sqlinjection-for-seminar.sql