30 DBMS_ASSERT
DBMS_ASSERTパッケージは、入力値のプロパティを検証するためのインタフェースを提供します。
参照:
PL/SQLでのSQLインジェクションの回避の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
この章のトピックは、次のとおりです:
30.1 DBMS_ASSERTの操作上のノート
ファンクションでアサートされたプロパティを判断する条件が満たされていない場合は、値のエラーが発生します。条件が満たされた場合は、戻り値として入力値が戻されます。通常、値は変更されずに戻されますが、一部のファンクションでは変更された値が戻されます。
30.2 DBMS_ASSERTサブプログラムの要約
この項では、DBMS_ASSERTパッケージのサブプログラムについて説明します。
表30-1 DBMS_ASSERTパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
文字列リテラルを引用符で囲みます。 |
|
文字列が引用符で囲まれていることを確認し、結果が有効なSQL識別子であるかどうかをチェックします。 |
|
チェックなしで値を戻します。 |
|
入力文字列が修飾SQL名であることを検証します。 |
|
入力文字列が既存のスキーマ名であることを検証します。 |
|
入力文字列が単純SQL名であることを検証します。 |
|
入力パラメータ文字列が既存のSQLオブジェクトの修飾SQL識別子であることを検証します。 |
30.2.1 ENQUOTE_LITERALファンクション
このファンクションは、文字列リテラルを開始一重引用符と終了一重引用符で囲みます。
構文
DBMS_ASSERT.ENQUOTE_LITERAL ( str VARCHAR2) RETURN VARCHAR2;
パラメータ
表30-2 ENQUOTE_LITERALファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
引用符で囲む文字列。 |
使用上のノート
-
先行および後続文字を除く、すべての一重引用符が対を成していることを検証します。
-
名前がすでに引用符で囲まれている場合、引用符は追加されません。
30.2.2 ENQUOTE_NAMEファンクション
このファンクションは、指定された文字列を二重引用符で囲みます。ただし、文字列がすでに引用符で囲まれている場合、引用符は追加されません。その後、引用符で囲まれた文字列は、有効な(引用符で囲まれた)簡易SQL名であるかどうかチェックされます。
データベース・オブジェクト名および修飾子の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
構文
DBMS_ASSERT.ENQUOTE_NAME ( str VARCHAR2, capitalize BOOLEAN DEFAULT TRUE) RETURN VARCHAR2;
パラメータ
表30-3 ENQUOTE_NAMEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
引用符で囲む文字列。 |
|
|
使用上のノート
-
名前がすでに引用符で囲まれている場合、引用符は追加されません。
-
文字列に含まれる他のすべての二重引用符が、隣り合う二重引用符のペアであることを確認してください。
例
-- This procedure creates a single column table in the createOneColumnTable's schema. create or replace procedure createOneColumnTable(proposedTableNamevarchar2) is BEGIN IF (proposedTableName is NULL) THEN raise value_error; END IF; -- The use of ENQUOTE_NAME ensures that the table will be created in the -- definer's schema and not in some other schema even if the definer has -- privileges to create tables in other schemas. EXECUTE IMMEDIATE 'create table ' || DBMS_ASSERT.ENQUOTE_NAME(proposedTableName) || ' (c1 number)'; EXCEPTION WHEN others THEN dbms_output.put_line('Table creation failed due to: ' || SQLERRM); END; / -- Examples of ENQUOTE_NAME showing input/output relationships BEGIN -- 'eMp' becomes '"EMP"' since it is unquoted dbms_output.put_line(DBMS_ASSERT.ENQUOTE_NAME('eMp')); END; / BEGIN -- For quoted strings, the case is preserved dbms_output.put_line(DBMS_ASSERT.ENQUOTE_NAME('"EmP"')); END; / -- Invalid identifier example BEGIN dbms_output.put_line(DBMS_ASSERT.ENQUOTE_NAME('SCOTT."EMP"')); END; / -- CHR(0) examples -- The following examples illustrates that CHR(0), the NULL character, cannot appear -- in the string; such a string poses a SQL injection risk. BEGIN dbms_output.put_line(DBMS_ASSERT.ENQUOTE_NAME('BAD' || CHR(0) || 'IDENTIFIER')); END; / BEGIN dbms_output.put_line(DBMS_ASSERT.ENQUOTE_NAME('"SCOTT' || CHR(0) || '.EMP"')); END; / -- Oracle allows a period (.) to be a part of a quoted string BEGIN dbms_output.put_line(DBMS_ASSERT.ENQUOTE_NAME('"SCOTT.EMP"')); END; / -- The single quotation mark ('), as opposed to a double quotation mark, can appear in the string -- Note: In Oracle, a single quotation mark is specified in a literal using two single -- quotes. The first quotation mark escapes the second quotation mark in the same way that -- backslash (\) in POSIX is an escape character. BEGIN dbms_output.put_line(DBMS_ASSERT.ENQUOTE_NAME('"O''LEARY"')); END; /
30.2.3 NOOPファンクション
このファンクションは、チェックなしで値を戻します。
構文
DBMS_ASSERT.NOOP ( str VARCHAR2 CHARACTER SET ANY_CS) RETURN VARCHAR2 CHARACTER SET str%CHARSET;
DBMS_ASSERT.NOOP ( str CLOB CHARACTER SET ANY_CS) RETURN CLOB CHARACTER SET str%CHARSET;
パラメータ
表30-4 NOOPファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
入力値。 |
30.2.4 QUALIFIED_SQL_NAMEファンクション
このファンクションは、入力文字列が修飾SQL名であることを検証します。
構文
DBMS_ASSERT.QUALIFIED_SQL_NAME ( str VARCHAR2 CHARACTER SET ANY_CS) RETURN VARCHAR2 CHARACTER SET str%CHARSET;
パラメータ
表30-5 QUALIFIED_SQL_NAMEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
入力値。 |
例外
ORA44004
: 修飾SQL名が無効です
使用上のノート
修飾SQL名<qualified name>は、次の文法で表現できます。
<local qualified name> ::= <simple name> {'.' <simple name>} <database link name> ::= <local qualified name> ['@' <connection string>] <connection string> ::= <simple name> <qualified name> ::= <local qualified name> ['@' <database link name>]
30.2.5 SCHEMA_NAMEファンクション
このファンクションは、入力文字列が既存のスキーマ名であることを検証します。
構文
DBMS_ASSERT.SCHEMA_NAME ( str VARCHAR2 CHARACTER SET ANY_CS) RETURN VARCHAR2 CHARACTER SET str%CHARSET;
パラメータ
表30-6 SCHEMA_NAMEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
入力値。 |
例外
ORA44001
: スキーマ名が無効です
使用上のノート
定義上は、スキーマ名は単純SQL名である必要はありません。たとえば、"FIRST
LAST
"は有効なスキーマ名です。したがって、スキーマ名の出力は、SQLテキストに連結する前に引用符で囲む必要があります。
30.2.6 SIMPLE_SQL_NAMEファンクション
このファンクションは、入力文字列が単純SQL名であることを検証します。
構文
DBMS_ASSERT.SIMPLE_SQL_NAME ( str VARCHAR2 CHARACTER SET ANY_CS) RETURN VARCHAR2 CHARACTER SET str%CHARSET;
パラメータ
表30-7 SIMPLE_SQL_NAMEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
入力値。 |
例外
ORA44003
: SQL名が無効です
使用上のノート
-
入力値は次の条件を満たす必要があります。
-
名前はアルファベット文字で始める必要があります。2文字目以降は、英数字、_、$および#を使用できます。
-
引用符付きのSQL名も使用できます。
-
引用符付きの名前は、二重引用符で囲む必要があります。
-
引用符付きの名前は、引用符の間に任意の文字を使用できます。
-
名前内の引用符は、引用文字を2つ連続して表記します。たとえば、"a name with "" inside"は有効な引用符付きの名前です。
-
入力パラメータには、先頭または末尾(あるいはその両方)に任意の数の空白文字を含むことができます。
-
-
名前の長さはチェックされません。
30.2.7 SQL_OBJECT_NAMEファンクション
このファンクションは、入力パラメータ文字列が既存のSQLオブジェクトの修飾SQL識別子であることを検証します。
構文
DBMS_ASSERT.SQL_OBJECT_NAME ( str VARCHAR2 CHARACTER SET ANY_CS) RETURN VARCHAR2 CHARACTER SET str%CHARSET;
パラメータ
表30-8 SQL_OBJECT_NAMEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
入力値。 |
例外
ORA44002
: オブジェクト名が無効です
使用上のノート
シノニムを使用するにはベース・オブジェクトが存在している必要があります。