サニタイジング、ちょうど私がINSERTを持つSQLクエリを含むローカル変数を作成に持ってとしましょう:SQL Serverの:引数のためにインジェクション攻撃に対する@param
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)
を、私は明らかにインジェクション攻撃を懸念だし、その@メッセージの値は、@挿入の値が悪意のあるまたはEXECへのクエリとして不正な形式にすることはできませんことを確認したいと思います。
これは私の質問に私をもたらします。「メッセージの文字を十分にエスケープしていますか? @messageに出てくる可能性のある他の文字がありますか?
例:
DECLARE @insert NVARCHAR(MAX)
SELECT @message = REPLACE(@message,'''','''''')
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
(私は「がに持っている」と言うとき、INSERT先のテーブルである、私のクエリは、ストアドプロシージャであるため、これは、このストアドプロシージャが@table受け入れます私は自分のアーキテクチャについて議論することに興味がありませんし、INSERTするテーブルがプロシージャのパラメータで「動的に」指定されているのはなぜですか?EXEC()以外の方法でテーブルを指定する方法プロシージャパラメータとしてテーブル名が受け取られたときにINSERTします。。
意図的に悪いコードを書く方法を扱う質問に本当に対処したいですか? – dkretz
解決策を見つけることを意味する場合、はい。開発者は、バングラデシュで書かれたプロジェクトをコンサルティングして8ドル/時間で継承している場合は、常に虚偽のコードを扱わなければなりません。私たちは常に、プロジェクトを最初から構築し、それを構築するべき方法を構築するという贅沢を得ているわけではありません。:) – core