クォーテーション名関数は、SQL Server で文字列を引用符で囲むために使用される
SQL ServerのQUOTENAME関数は、文字列値を引用符で囲み、文字列内の全ての引用符をエスケープ処理します。これは主に文字列値を動的SQL文中に組み立てるときに使用され、SQLインジェクション攻撃を防ぎます。
QUOTENAME 関数の構文は次のとおりです。
QUOTENAME ( ‘文字列’ [,‘引用文字’] )
パラメータの説明:
- 引用する文字列の値
- 引号キャラクターはオプションのパラメータで、引用符として使用される文字を指定します。デフォルトでは、角括弧([])が使用されます。
これはパズルを解く方法に関する本だ。
これこそパズルを解くための方法について書かれた本だ。
SELECT QUOTENAME('John') AS QuotedName;
-- 结果为 [John]
SELECT QUOTENAME('John O''Connor') AS QuotedName;
-- 结果为 [John O''Connor]
SELECT QUOTENAME('John', '''') AS QuotedName;
-- 结果为 'John'
動的SQL文において、文字列値がQUOTENAME関数で処理されていない場合、エラーまたは安全でない状態が発生する恐れがあります。たとえば、以下のような例を考慮してください。
DECLARE @tableName VARCHAR(50);
SET @tableName = 'MyTable; DROP TABLE MyTable; --';
DECLARE @sql NVARCHAR(1000);
SET @sql = 'SELECT * FROM ' + @tableName;
EXEC sp_executesql @sql;
@tableNameの値がQUOTENAME関数で囲まれていない場合、ダイナミックSQL文は次のようになります。
SELECT * FROM MyTable; DROP TABLE MyTable; --
ダイナミックSQLステートメントから「MyTable」テーブルのデータをセレクトし、そして「MyTable」テーブルを削除します。これはSQLインジェクション攻撃の例です。そのような攻撃を防ぐためには、@tableNameにQUOTENAME関数を適用するべきです。
DECLARE @tableName VARCHAR(50);
SET @tableName = 'MyTable; DROP TABLE MyTable; --';
DECLARE @sql NVARCHAR(1000);
SET @sql = 'SELECT * FROM ' + QUOTENAME(@tableName);
EXEC sp_executesql @sql;
以下の動的SQL文が生成されます。
SELECT * FROM [MyTable; DROP TABLE MyTable; --]
これにより、動的 SQL 文はデータのみテーブル「[MyTable; DROP TABLE MyTable; –]」から選択し、どのテーブルからも削除されないようになります。