4

従来の ASP 検索エンジンを更新して、SQL インジェクションから保護しようとしています。さまざまな検索パラメーターに基づいてクエリを連結することにより、クエリを動的に構築する VB 6 関数があります。これを、キーワードを除くすべてのパラメーターに対して動的 SQL を使用してストアド プロシージャに変換しました。

キーワードの問題は、ユーザーが提供する可変数の単語があり、キーワードごとに複数の列を検索する必要があることです。キーワードごとに個別のパラメーターを作成することはできないため、安全なクエリを作成するにはどうすればよいでしょうか?

例:

@CustomerId AS INT
@Keywords AS NVARCHAR(MAX)

@sql = 'SELECT event_name FROM calendar WHERE customer_id = @CustomerId '

--(loop through each keyword passed in and concatenate)

@sql = @sql + 'AND (event_name LIKE ''%' + @Keywords + '%'' OR event_details LIKE ''%' + @Keywords + '%'')'

EXEC sp_executesql @sql N'@CustomerId INT, @CustomerId = @CustomerId

これを処理し、SQL インジェクションからの保護を維持する最善の方法は何ですか?

4

4 に答える 4

3

これを聞きたくないかもしれませんが、データベースに対して発行する前に、コードで SQL クエリを動的に構築する方法に戻る方がよい場合があります。SQL 文字列でパラメーター プレースホルダーを使用すると、SQL インジェクション攻撃から保護されます。

例:

string sql  = "SELECT Name, Title FROM Staff WHERE UserName=@UserId";
using (SqlCommand cmd = new SqlCommand(sql))
{
  cmd.Parameters.Add("@UserId", SqlType.VarChar).Value = "smithj";

クエリが必要な一連の列に応じて SQL 文字列を作成し、文字列が完成したらパラメーター値を追加できます。これを行うのは少し面倒ですが、可能性のある入力の可能性のある順列を多数アンピックする非常に複雑な TSQL を使用するよりもはるかに簡単だと思います。

于 2008-09-30T22:12:20.570 に答える
1

ここには 3 つのオプションがあります。

  1. リスト テーブルを変換する関数を使用して、それに結合します。だからあなたはこのようなものを持つでしょう。

    SELECT * 
    FROM calendar c
       JOIN dbo.fnListToTable(@Keywords) k 
           ON c.keyword = k.keyword  
    
  2. パラメータの固定セットを持ち、最大 N 個のキーワードのみを検索できるようにする

    CREATE PROC spTest
    @Keyword1 varchar(100),
    @Keyword2 varchar(100),
    .... 
    
  3. TSQL でエスケープ文字列関数を記述し、キーワードをエスケープします。

于 2008-09-30T22:22:58.860 に答える
0

あなたはこれを試すことができます:

SELECT * FROM [tablename] WHERE LIKE % +keyword%
于 2010-10-17T23:02:07.610 に答える
0
  • 必要でない限り、 [a-zA-Z ] に含まれていない文字を単純に取り除くことができます - それらのほとんどは検索に含まれないため、そのように挿入することはできませんし、そうする必要もありませんキーワードやそのようなものについて心配してください。ただし、引用を許可する場合は、より注意する必要があります。

  • sambo99 の #1 と同様に、キーワードを一時テーブルまたはテーブル変数に挿入し、インジェクションの危険なしに (ワイルドカードを使用しても) 結合することができます。

これは実際には動的ではありません。

SELECT DISTINCT event_name
FROM calendar
INNER JOIN #keywords
    ON event_name LIKE '%' + #keywords.keyword + '%'
    OR event_description LIKE '%' + #keywords.keyword + '%'
  • 手動でコーディングする代わりに、多数のパラメーターを使用して SP を実際に生成できます (検索のコーディングの好みに応じて、デフォルトを '' または NULL に設定します)。より多くのパラメーターが必要であることがわかった場合は、生成されるパラメーターの数を増やすのは簡単です。

  • 検索を Lucene などのデータベース外のフルテキスト インデックスに移動し、Lucene の結果を使用して一致するデータベース行を取得できます。

于 2008-10-01T05:13:49.340 に答える