2026年6月9日火曜日

Oracle APEX 26.1のContent Security Policyの推奨設定を確認する

Oracle APEX 26.1では、より厳しいContent Security Policy(CSP)の設定でも、標準機能として提供されているJavaScriptやCSSが動作するようになりました。

Oracle APEX 24.2でのContent Security Policyについて、以下の記事で紹介しています。
Oracle APEX 24.2で強化されたContent-Security-Policyの対応について

この記事ではunsafe-hashesの追加方法を取り上げていますが、ひとつひとつハッシュ値を確認するのは現実的で無く、APEX 24.2でCSPの設定は難しい状況でした。

Oracle APEX 26.1からはunsafe-hashes(およびunsafe-inline)の設定が不要になっています。また、公式ドキュメントにContent Security Policyの設定方法が記載されました。

App Builder User's Guide, Release 26.1
21.2.6 Configuring Content Security Policy (CSP)

以下よりOracle APEX 26.1でのContent Security Policyの設定について確認します。

ドキュメント21.2.6.3 Understanding the CSP Headerに以下の記載があります。APEX 26.1で必要とされる設定です。

  • default-src 'self' - This directive restricts all default resource loading (scripts, styles, fonts, etc.) to the same origin as your application.
  • #APEX_CSP_NONCE# - APEX dynamically replaces this placeholder with a cryptographically secure nonce for each request. This allows inline scripts that include this nonce to execute, while blocking others.
  • 'unsafe-hashes' #APEX_CSP_HASHES# - Allows the use of specific inline scripts or styles that have been hashed and approved by APEX. Refers to the hashed value which corresponds to display:none;.
  • object-src 'none' - Disallows the use of <object>, <embed>, and <applet> elements, which are commonly exploited.
  • img-src 'self' data: - Allows images from the same origin and inline images encoded in data: URLs.
この中の'unsafe-hashes' #APEX_CSP_HASHES#については、リリース・ノートの以下の記述と整合していません。


In previous versions, APEX required the unsafe-hashes directive to allow inline styles like style="display:none;" during page load. This dependency is now eliminated.

リリース・ノートの記載が正しい(そうでないとunsafe-hashesが必要になります)はずです。unsafe-hashesの部分を外すと、推奨されるContent Security Policyの設定は以下になります。
Content-Security-Policy: default-src 'self' #APEX_CSP_NONCE#; object-src 'none'; img-src 'self' data:;
Oracle APEX 26.1で空のアプリケーションを作成し、Content Security Policyを設定します。

設定箇所は26.1以前と同じく、アプリケーション定義のセキュリティブラウザ・セキュリティHTTPレスポンス・ヘッダーです。


アプリケーションにファセット検索のページを作成し、ページを操作している際にCSP関連のエラーが発生しないかどうか、ブラウザのJavaScriptコンソールを開いて確認します。

簡単なテストですが、特にエラーは発生しません。


同様に対話グリッドのページを作成し、操作してみます。

こちらも、特にエラーは発生しません。


すべてのページ・タイプについて確認はしませんが、unsafe-inlineやunsafe-hashesが不要になるように、JavaScriptやCSSが再構成されているようです。

ただし、まだ完全とは言えないようです。

開発者ツール・バーからテーマ・ローラーを開くと、インラインのスタイル指定(sytle="..."の指定)が含まれているため、CSPのエラーが発生します。


セッションのセッション・オーバーライドでも同様のエラーが発生します。

なぜかセッション・オーバーライドを呼び出す前にテーマ・ローラーを開いていると、とりあえずセッション・オーバーライドのパネルを開くことができます。


Oracle APEX 26.1ではテンプレートからインラインのスタイル指定が省かれましたが、これはAPEX 26.1にバンドルされているテーマ/テンプレートが対象なので、APEX 26.1以前のテーマに含まれるテンプレートを使用しているAPEXアプリケーションは、その対象ではありません。APEX 26.1のテーマでリフレッシュする必要があります。

この他に気になった点として、以下があります。

21.2.6.2.3 Supported Substitution Stringsに置換文字列として#APEX_DISPLAY_NONE#とありますが、正しくは#APEX_CSP_DISPLAY_NONE#です。

ChatGPTに確認したところ、Oracle JETではimg-srcにblob:も必要なことがあると指摘されています。APEXはOracle JETを含んでいます。APEXとJETは開発チームは異なるため、JETについてはそれほど気にしていないかもしれません。ですので、img-srcに限り以下のようにblob:を追加した方がよいかもしれません。
img-src 'self' data: blob:

今回の記事は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

2026年6月8日月曜日

Oracle APEX 26.1のBlueprintの生成とインポートを試してみる

2026年5月14日にOracle APEX 26.1がリリースされました。APEX 26.1の新機能については、リリース・ノートで紹介されています。

Oracle APEX 26.1, Release Notes
2. New Features

26.1の一つ前の24.2のリリースから1年半程度の期間が経過しているためか、数多くの新機能が追加されています。

その中でBlueprintsが目に止まりました。

2.30 Blueprints

APEX now supports a new Markdown-based blueprint format for Spec-Driven Development (SDD) with AI coding assistants. With SDD, the specification becomes the durable source of truth: it describes what the application should do, what the database means, and how users should work with the data. An AI assistant can use those specifications to generate an inspectable APEX application design artifact that can be reviewed before creating the application.

For more information on blueprint support, see https://github.com/oracle/apex.

Importing an Application Blueprint

Application Blueprints can be imported directly through the App Builder Import page.

何を説明しているのか分からなかったので(Markdownをインポートしてアプリケーションを作成する?)、リンクが貼られているGitHubから内容を確認してみました。

GitHubのapexのリポジトリを開きます。blueprintsは26.1の新機能なので、ブランチとして26.1を選択します。フォルダblueprintsが現れます。

README.mdファイルに、スペックからAPEXのblueprintsを生成するフローが説明されています。


記述が抽象的で実際に何を行えばSDD(スペック駆動開発)ができるのか、よく分かりません。

スペックからAPEX Blueprintを生成してインポートするまでの具体的なステップが、QUICKSTART.mdに記述されています。

作業内容としては、生成AIでOrder Entryのアプリケーションのブループリントを生成し、APEXのワークスペースにインポートしてAPEXアプリケーションを作成しています。


実際に、このQUICKSTART.mdに記載されている作業を実施してみます。作業はMacbook Pro、データベースはローカルのコンテナ環境で実行しているOracle AI Database 26ai Freeを使用します。CodexとGPT-5.5を使って、APEX Blueprintを生成します。

作業ディレクトリとしてblueprintを作成し、そのディレクトリに移動します。

mkdir blueprint
cd bluerpint

最初にGitHubのリポジトリapexをクローンします。フォルダblueprintsを含むように、ブランチとして26.1を指定します。

git clone -b 26.1 https://github.com/oracle/apex.git

blueprint % git clone -b 26.1 https://github.com/oracle/apex.git

Cloning into 'apex'...

remote: Enumerating objects: 6382, done.

remote: Counting objects: 100% (527/527), done.

remote: Compressing objects: 100% (238/238), done.

remote: Total 6382 (delta 387), reused 324 (delta 286), pack-reused 5855 (from 1)

Receiving objects: 100% (6382/6382), 449.49 MiB | 7.62 MiB/s, done.

Resolving deltas: 100% (3112/3112), done.

blueprint % 


QUICKSTART.mdの作業に必要なファイルは、apex/blueprints/examples/order-entry以下に含まれます。このフォルダをCodexのプロジェクト・フォルダとします。

cp -r apex/blueprints/examples/order-entry .
ls order-entry

blueprint % cp -r apex/blueprints/examples/order-entry .

blueprint % ls order-entry 

database-objects README.md screenshots skills-input skills-output

blueprint % 


APEXのワークスペースを作成します。

ローカルのAPEX環境をUC Local APEX Devで作成しているため、添付のスクリプトを実行して、APEXワークスペースとしてblueprint、スキーマblueprint、管理者ユーザーとしてblueprintを作成します。

local-26ai.sh create-user blueprint

blueprint % local-26ai.sh create-user blueprint


loaded .env file


SQLcl: 月 6月 08 14:27:11 2026のリリース26.1 Production


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


接続先:

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0



USER    

_______ 

SYS     


[中略]


接続先:

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0



USER         

____________ 

BLUEPRINT    


名前: local-26ai-blueprint

接続文字列: localhost:1521/FREEPDB1

ユーザー: blueprint

パスワード: ******


PL/SQLプロシージャが正常に完了しました。


Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0から切断されました

>>>>

saved sqlcl connection

connect with 'sql -name local-26ai-blueprint'

blueprint % 


後で実行するblueprintのインポートが失敗しないように、データベース・ユーザーBLUEPRINTから、ロールSELECT_CATALOG_ROLEを外します。

sql -name local-26ai-sys
revoke select_catalog_role from blueprint;
exit

blueprint % sql -name local-26ai-sys


SQLcl: 月 6月 08 14:28:20 2026のリリース26.1 Production


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


接続先:

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0


SQL> revoke select_catalog_role from blueprint;


Revokeが正常に実行されました。


SQL> exit

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0から切断されました

blueprint % 


作成されたスキーマBLUEPRINTに、Order Entryアプリケーションが使用するデータベース・オブジェクトの作成や、サンプル・データの投入を行います。

スクリプトには19c向けと26ai向けがあります。今回は26ai向けを実行します。

ls order-entry/database-objects

blueprint % ls order-entry/database-objects 

order-entry-schema-19c.sql order-entry-seed-data-19c.sql

order-entry-schema-26ai.sql order-entry-seed-data-26ai.sql

blueprint % 


sql -name local-26ai-blueprint
@order-entry/database-objects/order-entry-schema-26ai.sql
@order-entry/database-objects/order-entry-seed-data-26ai.sql
exit

blueprint % sql -name local-26ai-blueprint


SQLcl: 月 6月 08 14:34:20 2026のリリース26.1 Production


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


接続先:

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0


SQL> @order-entry/database-objects/order-entry-schema-26ai.sql


View OREN_ORDERS_DVが削除されました。



Table OREN_ORDER_ITEMSが削除されました。



Table OREN_ORDERSが削除されました。



[中略]


Table OREN_ORDER_ITEMSが変更されました。



Table OREN_ORDER_ITEMSが変更されました。



Table OREN_ORDER_ITEMSが変更されました。



Table OREN_ORDER_ITEMSが変更されました。


SQL> @order-entry/database-objects/order-entry-seed-data-26ai.sql


0行削除されました。



0行削除されました。



0行削除されました。



0行削除されました。


[中略]



Table OREN_PRODUCTSが変更されました。



Table OREN_ORDERSが変更されました。



Table OREN_ORDER_ITEMSが変更されました。


SQL> exit

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0から切断されました

blueprint % 


リポジトリapexからコピーしたorder-entry/skills-output/order-entry-blueprint.mdが、生成済みのOrder EntryアプリケーションのAPEX blueprintです。

このファイルをorder-entry/skills-input以下にあるスペックと、apex/blueprints/prompt以下にあるプロンプトにより出力することが、いわゆるスペック駆動開発ということになります。

生成済みのblueprintを削除し、同じファイルをCodexに出力させます。生成AIがorder-entry/skills-input以下にあるスペックを適切に解釈できるのであれば、ほぼ同じファイルが作成されるだろうと期待できます。元のファイルはフォルダapex以下に残っているため、後で比較もできます。

rm order-entry/skills-output/order-entry-blueprint.md

blueprint % rm order-entry/skills-output/order-entry-blueprint.md

blueprint % 


フォルダorder-entryに移動します。

cd order-entry

DBとAPEXのスキルをロードします。私の好みでMicrosoft APMを使用します。SQLclでskills syncコマンドを実行しても良いでしょう。

以下の内容のファイルをapm.ymlとして作成します。
name: order-entry
version: 1.0.0
description: order entry blueprint
author: Yuji
dependencies:
  apm:
    # Oracle Database Skills
    - git: https://github.com/oracle/skills
      path: db
      ref: main
    # Oracle APEXlang Skills
    - git: https://github.com/oracle/skills
      path: apex
      ref: main
今回はCodexを使用するため、以下のコマンドを実行してCodex向けにスキルをインストールします。

apm install --target codex

order-entry % apm install --target codex

[>] Installing dependencies from apm.yml...

[>] Resolving skills-db...

[>] Resolving skills-apex...

[i] Targets: codex  (source: --target flag)

  [+] github.com/oracle/skills/apex#main #main @55679630

  |-- Skill integrated -> .agents/skills/

  [+] github.com/oracle/skills/db#main #main @55679630

  |-- Skill integrated -> .agents/skills/

[i] Added apm_modules/ to .gitignore


[*] Installed 2 APM dependencies in 1.2s.

ynakakoshi@Ns-Macbook order-entry % 


必ずしも必要ではないと思いますが、MCPサーバーなどの設定を.codex/config.tomlに記述します。
[mcp_servers.oracle-apexdev]
command = "/opt/homebrew/Caskroom/sqlcl/26.1.2.132.1334/sqlcl/bin/sql"
args = [ "-R", "4", "-mcp" ]

[sandbox_workspace_write]
network_access = true
以上でCodexを呼び出すところまでは準備できました。

Codexのデスクトップ・アプリを使用して、blueprintを生成してみます。

新規チャットを開始します。

新規プロジェクトの既存のフォルダとして、先ほど作成したフォルダorder-entryを使用します。使用するモデルとしてGPT-5.5を選択しています。


QUICKSTART.mdには、以下の文書をインストラクションとして与えることが記載されています。

Using the prompt and icon allowlist files:
- prompt/blueprint-prompt.md
- prompt/apex-fa-icons-allowlist.txt

Generate and overwrite:
- <full-path-to-output-blueprint.md>

Using:
- examples/order-entry/skills-input/order-entry-functional-requirements.md
- examples/order-entry/skills-input/order-entry-schema-metadata.md

Don't read any other files unless directed by the prompt.

プロンプトとなるblueprint-prompt.mdapex-fa-icons-allowlist.txtは、添付ファイルとして与えることにします。


これらのファイルはapex/blueprint/prompt以下に置かれています。


プロンプトとして以下を与え、APEX blueprintを生成します。
添付したファイルblueprint-prompt.mdおよびapex-fa-icons-allowlist.txtより、Oracle APEXのblueprintをskills-output/order-entry-blueprint.mdとして生成してください。
以下のファイルの内容だけが、生成するAPEX blueprintの要求仕様になります。
skills-input/order-entry-functional-requirements.md
skills-input/order-entry-schema-metadata.md


 30分程度でorder-entry-blueprint.mdが出力されました。

APEX向けの成果物なので、まずローカルのAPEXスキル手順と入力ファイルを確認します。あわせて、指定されたプロンプト雛形とアイコン許可リストは作業フォルダ外にあるため、読めるか確認しながら進めます。

入力仕様はかなり具体的で、ページ構成・ナビゲーション・SQL由来の表示列まで決まっています。次に、生成フォーマット側の指示と残りの要求を読み切って、blueprintとして矛盾なくまとめます。

blueprint生成ルール側は、ページ・リージョン・SQL・リンクをすべて完全に出す前提のフォーマットです。今は「どの見出し・項目名で出力するか」を確認して、生成後に機械的に欠けがないか点検できる形にします。

出力フォーマットの核は把握できました。これからblueprint本文を作成し、最後にアイコン許可リスト・必須ページ・主要な要求(Order Line IDやメニュー制約など)を照合します。

これから skills-output/order-entry-blueprint.md を新規作成します。かなり大きい成果物になるので、要求されたページ・リージョン・フォーム・LOV・メニューをコンパクトなblueprint形式に落とし込みます。

1 件のファイルを作成中 • 447行を書き込み中
再接続中 /5
1 件のファイルを作成中 • 376行を書き込み中
再接続中 /5
1個のファイルを作成しました

ファイルを作成しました。最後に、必須ページ・メニュー項目・Order Line IDの扱い・アイコン許可リストに対して軽く点検しています。

点検で、ページ数は17、リージョン数は39で、指定された主要ページは入っています。アイコン照合の抽出方法にファイル名が混ざってしまったので、そこだけ正しい抽出で再確認します。

LINE_ITEM_ID や行番号由来の識別子は出ていないことを確認しました。アイコン照合は許可リスト側の行末形式の影響で完全一致検索が効いていないようなので、別の方法で確認します。

生成しました: skills-output/order-entry-blueprint.md

確認した点:

  • 17ページ、39リージョンを出力
  • 指定のトップメニュー順を反映
  • Order Line IDOREN_ORDER_ITEMS.ORDER_ITEM_ID 由来で、LINE_ITEM_ID や行番号由来の識別子は未使用
  • 使用アイコンは apex-fa-icons-allowlist.txt 内に存在することを確認済み
order-entry-blueprint.mdドキュメント・MD
15:50

生成されたskills-output/order-entry-blueprint.mdをAPEXワークスペースにインポートします。作成済みのAPEXワークスペースblueprintにサインインします。

アプリケーション・ビルダーよりインポートを実行します。


インポートするファイルとしてskills-output/order-entry-blueprint.mdを選択します。ファイル・タイプアプリケーション・ブループリントです。

へ進みます。


ブループリント・インポート・エラーが発生しました。copy the full error log to the clipboardをクリックし、エラー・ログをクリップボードにコピーします。


Codexに貼り付けて、修正を依頼します。


修正も30分程度の時間がかかりました。

添付の検証エラー内容に沿って、skills-output/order-entry-blueprint.md を修正しました。

主な修正:

  • List of Values / Lists / Breadcrumb の構造を blueprint 文法どおりに修正
  • Calendar の Render AsstartDateCol / supplementalInfo に修正
  • Map の Render AslatitudeCol / longitudeCol / tooltip / hidden に修正
  • hidden列に残っていた不正な Format Mask を削除
  • Modal Forms ページグループを Forms に変更して参照も統一
  • Calendar SQL内の禁止されやすい order by を除去

確認済み:

  • 17ページ、39リージョンのまま維持
  • 使用アイコンは allowlist 内
  • LINE_ITEM_ID / ROWNUM / ROW_NUMBER は未使用です。
order-entry-blueprint.mdドキュメント・MD
16:24

再度、blueprintのインポートを実行ます。

blueprintのインポートですが、インポートが完了するとAPEXアプリケーションが作成されています。

作成されたアプリケーションを実行してみます。


アプリケーションのサインイン後にエラーが発生しました。


このエラーもCodexに貼り付けて、修正を依頼しました。

サインイン後にホームページを開く際に、以下のエラーが発生しました。 Failed to parse SQL query! ORA-20999: Failed to parse SQL query! ORA-06550: line 20, column 10: ORA-22848: cannot use BLOB type as comparison key
16:29

原因はHome Dashboardの「Top 5 Revenue Products Last 12 Months」カードSQLでした。PRODUCT_IMAGE がBLOBなのに GROUP BY に含まれていて、Oracleが ORA-22848 を出していました。

skills-output/order-entry-blueprint.md (line 523) を修正済みです。売上集計を内側のサブクエリで PRODUCT_ID 単位に行い、外側で OREN_PRODUCTS をJOINして画像BLOBを取得する形にしました。

確認済み:

  • PRODUCT_IMAGEGROUP BY / ORDER BY / WHERE / JOIN条件 に使われていません。
  • 画像表示用のSELECT列としては維持しています。
order-entry-blueprint.mdドキュメント・MD
16:30

修正されたblueprintを、再度インポートしました。

アプリケーションにサインイン後、Home Dashboardが表示されました。


Customer Order Detailsのページです。


Orders Workbenchのページです。


Orders Calendarのページです。


Store Command Mapのページです。


Management Hubのページです。


QUICKSTART.mdに記載されている作業は以上で完了です。

Markdown形式で記述されたAPEXアプリケーションを、blueprintとしてAPEXワークスペースにインポートできることは確認できましたが、Markdownの書式の説明がどこに記載されているのか、なぜCodexでblueprintが生成できたのかは、今のところ不明です。

リポジトリapexのblueprint関連のコミッターがNeil Fernandezさんなので、2026年7月9日にあるAPEX Office Hours、Part 7: What's new in Oracle APEX 26.1にて、この機能が紹介されるのではないかと期待しています。

今回の記事は以上になります。