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