1

アプリケーションでの SQL インジェクションの防止に関して簡単な質問があります。

私の Web アプリケーションの 2 つの異なる機能は、ユーザーが MSSQL データベースからアイテムを検索するために使用できるテキスト ボックスを使用します。この情報は GridView に表示されます。

このメソッドを使用してクエリを作成します。

sqldatasource.SelectCommand = "SELECT x from x where this_id LIKE '%" + txtbox.Text + "%' ORDER BY x ASC";

明らかに、ユーザー入力を取得してこのようなクエリに直接入力すると、基本的な SQL インジェクションが可能になります。アプリケーションでSQLインジェクションを防ぐためにこれをパラメータ化する方法を誰か説明してもらえますか?

前もって感謝します

4

3 に答える 3

5
sqldatasource.SelectCommand = @"SELECT x from x where this_id LIKE @inText ORDER BY x ASC";

cmd.Parameters.AddWithValue("@inText", "%" + txtbox.Text + "%");

LIKEワイルドカードで開始すると、苦痛になることに注意してください。大きなテーブルは悲しくてゆっくり進みます。

于 2012-07-12T21:55:06.300 に答える
0

1つの(あまり良くはありませんが、何もないよりはましです)方法は、txtBox.Textの内容をサニタイズしてから、サニタイズされた結果を使用することです。

sqlsource.SelectCommand = "SELECT x from x where this_id LIKE '%" + SanitizedString(txtBox.Text) + "%';";

// ... codes ...

private string SanitizedString(string given)
{
   string sanitized = given.Replace(";", string.Empty);
   sanitized = sanitized.Replace("--", string.Empty);
   // ... ad nauseum, conditions galore ...

   return sanitized;
}

...しかし、それは非常に労働集約的です。

行うことは、ストアドプロシージャの形式でバインド変数を使用することです。私が見ることができることから、フィルターtxtbox.Text条件をバインドし、それを渡すことができます。

クエリはdbで十分に単純で、次のようになります。

SELECT x from X where this_id LIKE :filter ORDER BY x ASC

これを呼び出すには、MSSQLがストアドプロシージャとどのように通信するかを調査する必要があります。

バインド変数を使用すると、コードを完全にSQLインジェクションから保護できます。 バインド変数が大好きです。彼らはあなたを愛してくれるからです。そして、邪悪なhax0rsはそうしません。

于 2012-07-12T21:51:46.240 に答える
-1

回答ありがとうございます。最後に、パラメーター化されたクエリで MSDN サイトからこれを使用しました。

    GetSubInfo.SelectParameters.Add("xparam", txtbox.Text);
    GetSubInfo.SelectCommand = "SELECT x from x where x_id LIKE @xparam ORDER BY x ASC";

これはホーガンの回答と非常によく似ていますが、構文がわずかに異なります。お役に立てれば!

于 2012-07-12T22:21:02.567 に答える