EnquoteIdentifier(identifier, maxIdentifierLength, charset, bAlwaysQuote, bCapitalize)
このメソッドは、識別子を検証し、二重引用符がない場合はそれを追加し、結果を戻します。
宣言
// C#
public static string EnquoteIdentifier(string identifier, int maxIdentifierLength,
OracleDatabaseCharset charset, bool bAlwaysQuote = true, bool bCapitalize =
true);
パラメータ
-
identifier入力識別子。
-
maxIdentifierLength許容される最大識別子長(バイト)。
-
charsetデータベース文字セット。
-
bAlwaysQuotetrueにすると、戻される識別子が必ず引用符で囲まれます。falseにすると、大/小文字の区別を保持する必要がある場合に、まだ引用符で囲まれていない単体の識別子にのみ引用符が追加されます。 -
bCapitalizetrueにすると、単体の識別子は、まだ二重引用符で囲まれていなければ、大文字になります。falseにすると、大文字と小文字が区別され、小文字が含まれている場合は二重引用符で囲まれます。
戻り値
識別子が二重引用符で囲まれて戻されます。ただし、次のどちらかの場合にまだ引用符で囲まれていない単体の識別子は除きます:
-
bAlwaysQuoteがfalseで、bCapitalizeがtrueである場合。 -
bAlwaysQuoteがfalseで、bCapitalizeがfalseで、識別子が大文字である場合。
例外
ArgumentNullException - 値はNULLにできません。(パラメータ'identifier'')
ArgumentException - 値が想定範囲内ではありません。(パラメータ'maxIdentifierLength')
OracleException - 識別子またはリテラルが無効です。
備考
このメソッドの目的は、SQLインジェクションの防止です。
単純SQL名が識別子としてサポートされています。つまり、修飾SQL名はサポートされていません。たとえば、SCHEMA.TABLEは修飾SQL名です。
まだ引用符で囲まれていない、単体の識別子は、bAlwaysQuoteがtrueである場合や、bCapitalizeがfalseでありそれに小文字が含まれている場合のみ、引用符で囲まれます。bCapitalizeがtrueである場合は、それは大文字になります。
引用符で囲まれた識別子はそのまま戻されますが、引用符で囲まれているその識別子に二重引用符やNULL文字を含めることはできません。
その他の識別子には、二重引用符とNULL文字を除くどの文字でも含めることができます。その識別子は二重引用符で囲まれます。
空の識別子は使用できません。
先頭と末尾の空白は、引用符で囲まれている場合は無視されず、切り捨てられません。
予約語は必ず引用符で囲まれます。
識別子の検証には、maxIdentifierLengthとcharsetが使用されます。識別子の長さは、データベース文字セットで表される場合は、最小でも1バイトで、最大でもmaxIdentifierLengthのバイト数である必要があります。識別子の長さには、引用符で囲まれた識別子にある二重引用符はカウントされません。
ODP.NETにより、charsetを使用して、その識別子を表すことができる指定されたデータベース文字セットが検証されます。引用符の代替表現を使用するとSQLインジェクションがもたらされる可能性があります。そのデータベース文字セットで引用符を正しく表すことができない場合は、OracleExceptionがスローされます。
この表では、様々な入力値および設定に対するEnquoteIdentifierメソッドの出力を示しています。
| 入力 | 出力: bCapitalize=true bAlwaysQuote=false | 出力: bCapitalize=false bAlwaysQuote=false | ノート |
|---|---|---|---|
|
|
|
引用符も大文字変換も必要ありません。 |
|
|
|
|
|
|
|
すでに引用符で囲まれており、囲まれたままになります。 |
|
|
|
単体の識別子では、?は使用できません。大文字変換はありません。引用符が必要です。 |
|
|
|
予約語は引用符で囲まれます。 |
|
|
|
先頭と末尾の空白は無視されず、切り捨てられません。引用符が必要です。これは単体の識別子ではないため、大文字変換されません。 |
このODP.NETコード・サンプルでは、OracleDBMSAssert.EnquoteIdentifierを使用してSQLインジェクションによる侵害から問合せを保護する方法を示しています。
例
// C#
using System;
using System.Data;
using Oracle.ManagedDataAccess.Client;
class EnquoteIdentifierSample
{
static void Main()
{
string constr = "User Id=HR;Password=<PASSWORD>;Data Source=<DATA SOURCE>";
OracleConnection con = new OracleConnection(constr);
con.Open();
string tableName "employees";
string cmdText = "SELECT count(*) FROM " + OracleDBMSAssert.EnquoteIdentifier(tableName, 128, OracleDatabaseCharset.AL32UTF8, false);
// Resulting Command Text: "SELECT count(*) FROM EMPLOYEES"
OracleCommand cmd = new OracleCommand(cmdText);
object count = cmd.ExecuteScalar();
Console.WriteLine("There are " + count + " rows in the table.");
cmd.Dispose();
con.Dispose();
}
}