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インジェクションが発生する可能性があります。