EnquoteLiteral(literal, charset)

このメソッドは、リテラルを検証し、必要に応じて一重引用符を追加し、結果を戻します。

宣言

// C#
public static string EnquoteLiteral(string literal, OracleDatabaseCharset charset);

パラメータ

  • literal

    入力文字列リテラル。

  • charset

    データベース文字セット。

戻り値

リテラルが一重引用符で囲まれて戻されます。

例外

ArgumentNullException - 値はNULLにできません。(パラメータ'identifier'')

OracleException - 識別子またはリテラルが無効です。

備考

このメソッドの目的は、SQLインジェクションの防止です。

リテラル内の一重引用符は、エスケープまたはオーバーロードの目的で、2つの一重引用符に置き換えられます。たとえば、入力文字列scott'sは、戻り値では'scott''s'になります。

空のリテラルは、このメソッドで引用符を追加してODP.NETで使用できます。

先頭と末尾の空白は、引用符で囲まれている場合は無視されず、切り捨てられません。

ODP.NETにより、charsetを使用して、そのリテラルを表すことができる指定されたデータベース文字セットが検証されます。引用符の代替表現を使用するとSQLインジェクションがもたらされる可能性があります。そのデータベース文字セットで引用符を正しく表すことができない場合は、OracleExceptionがスローされます。

この表では、様々な入力値について、EnquoteLiteralメソッドの出力を示しています。

入力 出力 ノート
scott
'scott'

囲み一重引用符を追加します。

scott's name
'scott''s name'

囲み一重引用符を追加します。既存の一重引用符は、2つの一重引用符に置き換えられます。

    scott    
'    scott    '

囲み一重引用符を追加します。先頭と末尾の空白は無視されず、切り捨てられません。

このODP.NETコード・サンプルでは、OracleDBMSAssert.EnquoteLiteralを使用してSQLインジェクションによる侵害から問合せを保護する方法を示しています。

// C#
using System;
using System.Data;
using Oracle.ManagedDataAccess.Client;

class EnquoteLiteralSample
{
  static void Main()
  {
    string constr = "User Id=HR;Password=<PASSWORD>;Data Source=<DATA SOURCE>";
    OracleConnection con = new OracleConnection(constr);
    con.Open();

    string empName "Walsh";
    string cmdText = "SELECT FIRST_NAME FROM EMPLOYEES WHERE LAST_NAME = " + 
OracleDBMSAssert.EnquoteLiteral(empName, OracleDatabaseCharset.AL32UTF8);
    // Resulting Command Text: "SELECT FIRST_NAME FROM EMPLOYEES WHERE LAST_NAME = 'Walsh'"

    OracleCommand cmd = new OracleCommand(cmdText);
    DataReader reader = cmd.ExecuteReader();
    if(reader.Read())
    {
      Console.WriteLine("The first name for " + empName + " is " + reader.GetString(0));
    }

    reader.Dispose();
    cmd.Dispose();
    con.Dispose();
  }
}