25 DBMS_ASSERT

DBMS_ASSERTパッケージは、入力値のプロパティを検証するためのインタフェースを提供します。

参照:

PL/SQLでのSQLインジェクションの回避の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

この章のトピックは、次のとおりです:

25.1 DBMS_ASSERTの操作上のノート

ファンクションでアサートされたプロパティを判断する条件が満たされていない場合は、値のエラーが発生します。条件が満たされた場合は、戻り値として入力値が戻されます。通常、値は変更されずに戻されますが、一部のファンクションでは変更された値が戻されます。

25.2 DBMS_ASSERTサブプログラムの要約

この項では、DBMS_ASSERTパッケージのサブプログラムについて説明します。

表25-1 DBMS_ASSERTパッケージのサブプログラム

サブプログラム 説明

ENQUOTE_LITERALファンクション

文字列リテラルを引用符で囲みます。

ENQUOTE_NAMEファンクション

文字列が引用符で囲まれていることを確認し、結果が有効なSQL識別子であるかどうかをチェックします。

NOOPファンクション

チェックなしで値を戻します。

QUALIFIED_SQL_NAMEファンクション

入力文字列が修飾SQL名であることを検証します。

SCHEMA_NAMEファンクション

入力文字列が既存のスキーマ名であることを検証します。

SIMPLE_SQL_NAMEファンクション

入力文字列が単純SQL名であることを検証します。

SQL_OBJECT_NAMEファンクション

入力パラメータ文字列が既存のSQLオブジェクトの修飾SQL識別子であることを検証します。

25.2.1 ENQUOTE_LITERALファンクション

このファンクションは、文字列リテラルを開始一重引用符と終了一重引用符で囲みます。

構文

DBMS_ASSERT.ENQUOTE_LITERAL (
   str            VARCHAR2) 
RETURN VARCHAR2;

パラメータ

表25-2 ENQUOTE_LITERALファンクションのパラメータ

パラメータ 説明

str

引用符で囲む文字列。

使用上のノート

  • 先行および後続文字を除く、すべての一重引用符が対を成していることを検証します。

  • 名前がすでに引用符で囲まれている場合、引用符は追加されません。

25.2.2 ENQUOTE_NAMEファンクション

このファンクションは、指定された文字列を二重引用符で囲みます。ただし、文字列がすでに引用符で囲まれている場合、引用符は追加されません。その後、引用符で囲まれた文字列は、有効な(引用符で囲まれた)簡易SQL名であるかどうかチェックされます。

データベース・オブジェクト名および修飾子の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

DBMS_ASSERT.ENQUOTE_NAME (
   str            VARCHAR2, 
   capitalize     BOOLEAN DEFAULT TRUE)
RETURN VARCHAR2;

パラメータ

表25-3 ENQUOTE_NAMEファンクションのパラメータ

パラメータ 説明

str

引用符で囲む文字列。

capitalize

TRUEまたはデフォルトに設定すると、引用符で囲まれていないstrの英字は大文字に変換されます。

使用上のノート

  • 名前がすでに引用符で囲まれている場合、引用符は追加されません。

  • 文字列に含まれる他のすべての二重引用符が、隣り合う二重引用符のペアであることを確認してください。

-- 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;
/

25.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;

パラメータ

表25-4 NOOPファンクションのパラメータ

パラメータ 説明

str

入力値。

25.2.4 QUALIFIED_SQL_NAMEファンクション

このファンクションは、入力文字列が修飾SQL名であることを検証します。

構文

DBMS_ASSERT.QUALIFIED_SQL_NAME (
   str      VARCHAR2 CHARACTER SET ANY_CS)
 RETURN     VARCHAR2 CHARACTER SET str%CHARSET;

パラメータ

表25-5 QUALIFIED_SQL_NAMEファンクションのパラメータ

パラメータ 説明

str

入力値。

例外

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>] 

25.2.5 SCHEMA_NAMEファンクション

このファンクションは、入力文字列が既存のスキーマ名であることを検証します。

構文

DBMS_ASSERT.SCHEMA_NAME (
   str      VARCHAR2 CHARACTER SET ANY_CS)
 RETURN     VARCHAR2 CHARACTER SET str%CHARSET;

パラメータ

表25-6 SCHEMA_NAMEファンクションのパラメータ

パラメータ 説明

str

入力値。

例外

ORA44001: スキーマ名が無効です

使用上のノート

定義上は、スキーマ名は単純SQL名である必要はありません。たとえば、"FIRST LAST"は有効なスキーマ名です。したがって、スキーマ名の出力は、SQLテキストに連結する前に引用符で囲む必要があります。

25.2.6 SIMPLE_SQL_NAMEファンクション

このファンクションは、入力文字列が単純SQL名であることを検証します。

構文

DBMS_ASSERT.SIMPLE_SQL_NAME (
   str      VARCHAR2 CHARACTER SET ANY_CS)
 RETURN     VARCHAR2 CHARACTER SET str%CHARSET;

パラメータ

表25-7 SIMPLE_SQL_NAMEファンクションのパラメータ

パラメータ 説明

str

入力値。

例外

ORA44003: SQL名が無効です

使用上のノート

  • 入力値は次の条件を満たす必要があります。

    • 名前はアルファベット文字で始める必要があります。2文字目以降は、英数字、_、$および#を使用できます。

    • 引用符付きのSQL名も使用できます。

    • 引用符付きの名前は、二重引用符で囲む必要があります。

    • 引用符付きの名前は、引用符の間に任意の文字を使用できます。

    • 名前内の引用符は、引用文字を2つ連続して表記します。たとえば、"a name with "" inside"は有効な引用符付きの名前です。

    • 入力パラメータには、先頭または末尾(あるいはその両方)に任意の数の空白文字を含むことができます。

  • 名前の長さはチェックされません。

25.2.7 SQL_OBJECT_NAMEファンクション

このファンクションは、入力パラメータ文字列が既存のSQLオブジェクトの修飾SQL識別子であることを検証します。

構文

DBMS_ASSERT.SQL_OBJECT_NAME (
   str      VARCHAR2 CHARACTER SET ANY_CS)
 RETURN     VARCHAR2 CHARACTER SET str%CHARSET;

パラメータ

表25-8 SQL_OBJECT_NAMEファンクションのパラメータ

パラメータ 説明

str

入力値。

例外

ORA44002: オブジェクト名が無効です

使用上のノート

シノニムを使用するにはベース・オブジェクトが存在している必要があります。