0

パラメータを使用するのが難しいように見えるため、動的 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
4

1 に答える 1

1
  1. 読み取り専用ユーザーを使用できます。これにより、少なくとも更新がブロックされます。
  2. INSERT、UPDATE など、疑わしいと思われるキーワードを探します。
  3. このようなサードパーティのライブラリを使用する

これは、アンチインジェクション技術の良い束です

于 2013-09-29T22:46:16.157 に答える