パラメータを使用するのが難しいように見えるため、動的 SQL を使用しなければならない状況があります。
動的に実行するクエリは次のとおりです。 悪意のある SQL について @sql の文字列を検証する最良の方法は何ですか? 「CountryId = 23」のような有効な文字列を許可する必要がありますが、「国から削除」のような文字列は許可しません。私はすべてが許可されないようにしたくありません。
C# を使用して、SQL Server 2008 R2 に対してこのクエリを実行しています。
おそらく、SQL レベルまたは C# レベルで検証できますが、どちらが優れているかはわかりません。
SET @sql = 'SELECT * from Customers
where ' + @filterExpression +
' order by ' + @sortExpression;
EXEC sp_executesql @sql
更新:マキシムの回答は、動的 SQL を使用する必要がある状況に最適なようですが、この投稿にあるコードのような動的 SQL はできるだけ避ける必要があります。
T-SQL の @filterExpression 変数を検証して、悪意のある SQL コードを検証する方法を思いつきましたが、悪意のあるケースを見逃す可能性がありますが、これが私が思いついた T-SQL です。
IF PATINDEX('%DELETE %', @filterExpression ) > 0
OR PATINDEX('%SELECT %FROM%', @filterExpression ) > 0
OR PATINDEX('%;%', @filterExpression ) > 0
OR PATINDEX('%DROP %', @filterExpression ) > 0
OR PATINDEX('%CREATE %', @filterExpression ) > 0
OR PATINDEX('%TRUNCATE %', @filterExpression ) > 0
OR PATINDEX('%sys%', @filterExpression ) > 0
OR PATINDEX('%INDEX %', @filterExpression ) > 0
OR PATINDEX('%UPDATE %', @filterExpression ) > 0
OR PATINDEX('%INSERT %', @filterExpression ) > 0
OR PATINDEX('%EXEC %', @filterExpression ) > 0
OR PATINDEX('%EXECUTE %', @filterExpression ) > 0
OR PATINDEX('%CAST%', @filterExpression ) > 0
OR PATINDEX('%DECLARE %', @filterExpression ) > 0
OR PATINDEX('%CONVERT%', @filterExpression ) > 0
BEGIN
RETURN;
END