ワークスペースAPEXDEVにサインインし、テストに使用するアプリケーションを作成します。このアプリケーションには、意図的にSQLインジェクションに脆弱であるSQLを含めます。
アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前はSQLインジェクションとします。アプリケーションの作成を実行します。
ホーム・ページにリージョンを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
表HR.EMPを編集する対話グリッドのページを作成します。ページの作成を実行し、ページ作成ウィザードを起動します。
フォームを選択します。
編集可能対話グリッドを選択します。
ページ名を従業員編集として、次へ進みます。
ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選びます。次へ進みます。
データ・ソースをローカル・データベース、編集が有効をONとします。ソース・タイプとしてSQL問合せを選択し、SQL問合せとして以下のSQLを記述します。作成をクリックします。
SELECT ROWID, EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM HR.EMP
作成したページを実行すると、以下になります。従業員の挿入、更新、削除といった操作を行えます。
対話グリッドのページをもう一枚作成します。操作の流れは同じなので、異なる部分だけを示します。ページ作成ウィザードを起動し、編集可能対話グリッドを選択します。
ページ名は部分編集とします。
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