1

名前が「#t」などの変数値であるテーブルを削除するとします。

SqlCommand cmd = new SqlCommand( "drop table " + TableName ); //Not safe
SqlCommand cmd = new SqlCommand( "drop table [" + TableName +"]" ); //Not safe
EXEC( 'drop table [' + @tablename +"]" ); --Not safe

上記のどれも SQL インジェクションから安全ではありません。代替手段は何ですか?

人々は「動的 SQL を使用する必要がある」と言いますが、例には通常、上記の 3 番目の例のように安全でない連結が含まれています。

私が見つけることができる答えに最も近いもの(https://stackoverflow.com/a/14026855/88409)は、基本的に自分でチェックを行う必要があり、それを回避する方法はないと言っています(つまり、変数を解析して有効であることを確認しますまたは信頼できるソースから入手する)、しかし私はその答えに満足していません.

4

1 に答える 1

3

このQUOTENAME関数は、変数が「有効な SQL Server 区切り識別子」として扱われることを確認します。

次に、指定されたテーブルが削除を許可されるべきかどうかを決定するのはあなた次第です。おそらく、テーブルに対する SQL 権限または削除できるテーブルのホワイトリストを使用して...

于 2013-10-22T21:03:46.107 に答える