OceanBaseデータベースのOracleモードでは、フォーマットモデルは文字列に格納される日付時刻または数値データの形式を記述するテキストです。データ変換を行う際には、関連するセキュリティ上の注意事項があります。
日付時刻値を暗黙的にテキストに変換する場合、またはフォーマットモデルを指定せずに明示的にテキストに変換する場合、ソースデータの型に応じて、フォーマットモデルは対応するグローバルセッションシステム変数によって定義されます。これらのシステム変数には NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT、または NLS_TIMESTAMP_TZ_FORMAT が含まれます。これらのパラメータの値は、クライアント環境または ALTER SESSION ステートメントで指定できます。
フォーマットモデルを指定せずに動的SQLステートメントに関連付けられた日付時刻値を明示的に変換する場合、フォーマットモデルがシステム変数に依存していることがデータベースのセキュリティに悪影響を及ぼす可能性があります。
動的SQLステートメントとは、PLプログラムまたはストアドプロシージャによって生成されるSQLステートメントを指します。OceanBaseデータベースは EXECUTE IMMEDIATE ステートメントを使用して、ほとんどの動的SQLステートメントを処理します。特定の条件下では、PLシステムパッケージ DBMS_SQL を使用して動的SQLステートメントを実行することもできます。
以下の例のように、start_date のデータ型は DATE であり、システム変数 NLS_DATE_FORMAT で指定されたフォーマットモデルを使用して start_date の値をテキストに変換し、その結果をSQLテキストに渡します。日付時刻のフォーマットモデルは、シングルクォートで囲まれたテキストで簡単に構成できます。
SELECT last_name FROM employees WHERE hiredate > '' || start_date || '';
説明
- ユーザーは、明示的変換のフォーマットモデルにグローバルシステム変数を設定することで、上記の例でどのようなテキストが生成されるかを決定します。
- SQLステートメントがプロシージャによって実行される場合、そのプロシージャの実行がセッション変数の変更によってSQLインジェクションの標的になる可能性があります。一部のプロシージャがより高い権限(例:Definer's Rights Procedure)を持つ場合、生じるセキュリティ上の影響はさらに大きくなる可能性があります。
数値の暗黙的および明示的変換でも同様の問題が発生する可能性があります。変換結果はセッションシステム変数 NLS_NUMERIC_CHARACTERS に依存する場合があるためです。このシステム変数は小数点区切り文字と千分の位区切り文字を定義します。小数点区切り文字をクォートまたはダブルクォートで定義した場合、SQLインジェクションが発生する可能性があります。