5

SQL インジェクションに対して脆弱なプロジェクトを修正する必要があります。

プロジェクトのすべてのページのすべてのフォームは、パラメーター化されたクエリを使用せず、単に文字列クエリを使用します。

たとえば検索ページがあり、コード ビハインドを見ると、CreateQuery()例としてテキスト フィールドに基づいてクエリを作成するメソッドがあることがわかります。

string sQuery = "";
sQuery += "b.name like '%" + txtName.Text + "%'";

次にbtnSearch_Click()、クエリを実行するメソッドがあります。

query = CreateQuery();
var totalList = GetAllBlaBla(query);

私の質問は:

私は何百ものフォームと何千ものformText値をFIXに持っているので、実装するための「迅速な」解決策はありますか?

  1. クエリをパラメータ化する、または何らかの方法で状況を処理するグローバル関数?
  2. SubmitButton_Click()すべてのクラスでコード ビハインド メソッドでクエリが実行されるため、ここで、もちろんすべてのクラスで状況を処理できますか?
  3. すべてのフォームとコード ビハインドのすべてのエントリを変更して、SQL 文字列をパラメーター化する必要があります。これには 100 万年かかりますか?
  4. (編集) 入力値のエンコード/デコードはどうですか? 上記の例は次のようになります。

    string sQuery = "";
    var txt = var txt = HttpUtility.HtmlEncode(txtName.Text);
    sQuery += "b.name like '%" + txt + "%'";
    

    これは一時的なパッチの可能性がありますか?

5-(編集)これは可能な解決策ですか、それとも単に何も変更しませんか?

        cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
        cmd.Parameters["@txtNameParameter"].Value = txtName.Text;
        sQuery += "b.name like '%" + (string)cmd.Parameters["@txtNameParameter"].Value + "%'";

問題は、クエリを処理するロジックが、文字列をクエリとして受け取る別のビジネス クラスで定義されているため、文字列を返さなければならないことです。CommandType または SqlDataAdapter を指定することはできません...

提案?

前もって感謝します。

4

6 に答える 6

4

問題があることはすでにわかっています。IMO、ここでの「迅速な」修正は攻撃面を減らす可能性がありますが、決定的な悪用を防ぐ可能性は低いです。簡単に言えば、ブラックリストに登録するのは非常に難しく、ブラックハット サイト (およびサンプルとしてホワイト ハット サイト) ですぐに利用できる非常に奇妙な入力がいくつかあります。これらは、虐待として常に容易に認識できるわけではありません。それだけじゃない' drop table Customers --;p

何をするにしても、適切に行うことをお勧めします。パラメーター。ただし、 dapperのようなツールを使用すると、必要なコードを減らすことができます。

sQuery += "b.name like '%'+@text+'%'"
...
conn.Execute(sQuery, new {text=txtName.Text});

(すべてのパラメータなどを手動で処理するよりも簡単です)

于 2011-07-04T12:23:18.113 に答える
1

プレーンウェイ

プロジェクトで を検索して、交換の数を見積もりstring sQuery = "ます。1 つのクエリの修正に費やす予定の時間を掛けます (たとえば、5 分間に 1 回の修正と、10 回の修正ごとに 1 回のコーヒー ブレーク)。

Web サイト全体をテストする時間を追加します。

次に、修正が膨大になることを経営陣に伝え、見積もりを出して実行してください
確かに、数日間は頭痛がしますが、少なくとも問題は解決します。

創造的な方法

文字通り、ほぼ同じコード (例: クエリは常に で作成され、 で実行される) を含む数百、数千のフォームを意味する場合、 Visual Studio の正規表現構文の使い方を学び、非常に正確な検索と置換のパターンをいくつか作成することを検討します。CreateQuerySubmitButton_Click

これにより、1 つのプロジェクトで何時間もの作業時間を節約できましたが、正規表現を非常に正確に扱い、自分が何をしているのかを確実に理解する必要があります。

もう 1 つのオプションは、価値があると確信している場合は、C# ソースを書き換えるツールを作成することです。
必要なのはMarc が言及したような単純な変換だけである場合、数時間の作業が必要になる可能性があります。
しかし、ここで惨めに失敗する可能性があるので、危険なルートです。

于 2011-07-04T12:33:52.030 に答える
1

すべてのクエリを変更し、すべての入力を検証します。

時間はかかりますが、その「大きな Web アプリケーション」の保守と機能の追加を行う担当者について考えてみてください (それはあなたかもしれません)。

于 2011-07-04T12:22:17.917 に答える
1
<customErrors mode="On"/> 

これにより、ユーザーはエラーを見ることができなくなるため、潜在的なハッカーは、表示されるエラー メッセージに基づいて、このセキュリティ ドアを悪用する方法の手がかりがほとんど
なくなります エラーをログに記録するために Elmah を追加します。
パラメーターを使用するか、ORM を使用するようにすべてのクエリを書き直します。
「ハッカー」はそれを無効にする方法を確実に知っているため、JavaScriptベースのソリューションは役に立ちません。

于 2011-07-04T12:29:02.150 に答える
-1

ページロード中に各ページのすべてのテキストボックスコントロールを見つけ、特殊キーの押下処理を無効にします

于 2011-07-04T12:27:17.603 に答える