議論のために、INSERT を持つ SQL クエリを含むローカル変数を作成する必要があるとしましょう。
DECLARE @insert NVARCHAR(MAX)
SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES...
EXEC (@insert)
この INSERT には、列の値も含まれます。
DECLARE @insert NVARCHAR(MAX)
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
さて、私は明らかにインジェクション攻撃を懸念しており、@message の値によって @insert の値が悪意のあるものや、EXEC へのクエリとして不正な形式にならないようにしたいと考えています。
これは私の質問につながります: @message の ' 文字をエスケープするだけで十分ですか? @message に表示され、エスケープできる他の文字はありますか?
例:
DECLARE @insert NVARCHAR(MAX)
SELECT @message = REPLACE(@message,'''','''''')
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
(私が「する必要がある」と言うとき、これはクエリがストアド プロシージャにあり、このストアド プロシージャが INSERT 先のテーブルである @table を受け入れるためです。自分のアーキテクチャや、なぜテーブルがto INSERT into は、プロシージャ パラメータを介して「動的に」指定されます。テーブル名をプロシージャ パラメータとして受け取ったときに、INSERT 先のテーブルを指定するクエリを EXEC() する以外に別の方法がない限り、これについてコメントすることは控えてください。)