SQL インジェクションに対して脆弱なプロジェクトを修正する必要があります。
プロジェクトのすべてのページのすべてのフォームは、パラメーター化されたクエリを使用せず、単に文字列クエリを使用します。
たとえば、検索ページがあり、コード ビハインドを見ると、CreateQuery()
例としてテキスト フィールドに基づいてクエリを作成するメソッドがあることがわかります。
string sQuery = "";
sQuery += "b.name like '%" + txtName.Text + "%'";
次にbtnSearch_Click()
、クエリを実行するメソッドがあります。
query = CreateQuery();
var totalList = GetAllBlaBla(query);
私の質問は:
私は何百ものフォームと何千ものformText
値をFIXに持っているので、実装するための「迅速な」解決策はありますか?
- クエリをパラメータ化する、または何らかの方法で状況を処理するグローバル関数?
SubmitButton_Click()
すべてのクラスでコード ビハインド メソッドでクエリが実行されるため、ここで、もちろんすべてのクラスで状況を処理できますか?- すべてのフォームとコード ビハインドのすべてのエントリを変更して、SQL 文字列をパラメーター化する必要があります。これには 100 万年かかりますか?
(編集) 入力値のエンコード/デコードはどうですか? 上記の例は次のようになります。
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 を指定することはできません...
提案?
前もって感謝します。