1

私はasp.netアプリケーションを持っています。私はこのコードを持っています:

 using (Data.connexion)
    {
        string queryString = @"select id_user , nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login =@login and mdp=@mdp";
        SqlCommand command = new SqlCommand(queryString, Data.connexion);
        command.Parameters.AddWithValue("@login", _login);
        command.Parameters.AddWithValue("@mdp", _password.GetHashCode().ToString());
        try
        {
            SqlDataReader reader = command.ExecuteReader();
            do
            {
                while (reader.Read())
                {
                    return View("Success");
                }
            } while (reader.NextResult());

        }
        catch {  }
    }

このログインを使用して Sql インジェクション攻撃を試みると'' or 1=1 --、攻撃は失敗します。しかし、これでスニペットを変更すると:

 using (Data.connexion)
            {
                string queryString = @"select id_user , nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login =" + _login + " and mdp=" + _password.GetHashCode().ToString();
                SqlCommand command = new SqlCommand(queryString, Data.connexion);
              //  command.Parameters.AddWithValue("@login", _login);
               // command.Parameters.AddWithValue("@mdp", _password.GetHashCode().ToString());
                try
                {
                    SqlDataReader reader = command.ExecuteReader();
                    do
                    {
                        while (reader.Read())
                        {
                            return View("Success");
                        }
                    } while (reader.NextResult());

                }
                catch {  }
            }

ビューにリダイレクトされるsuccessので、攻撃は成功します。

2 つのコーディング方法の違いは何ですか? Sql インジェクション攻撃を防止および回避する最善の方法は何ですか?

4

2 に答える 2

3

SQL インジェクションから保護する最善の方法は、パラメーター化されたクエリを使用することです。

値を文字列に連結するときは安全にすることができますが、正確に行う必要があり、正確な方法はデータベースのブランドによって異なります。

SQL Server の場合、文字列内のアポストロフィを 2 倍にして、文字列値をエンコードします。そうすれば、アポストロフィはデータベースによって正しく解釈され、アポストロフィを使用して文字列を分割することはできなくなります。

string queryString = "select id_user, nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login = '" + _login.Replace("'","''") + "' and mdp = '" + _password.GetHashCode().ToString().Replace("'","''") + "'";

ただし、パラメーター化されたクエリを使用する方が簡単で、データベース ドライバーがこれを行います。エンコーディングを自分で処理しようとして正しく処理できない場合は、問題は処理されたものの、SQL インジェクション攻撃に広くさらされる可能性があると考えているため、さらに悪い状況に陥っています。


補足: このString.GetHashCode方法は、パスワードのハッシュなどには適していません。メソッドの実装は、(過去と同様に) 将来変更される可能性があり、データベース内のすべてのハッシュされたパスワードが役に立たなくなる可能性があります。

「ハッシュコード値をシリアライズしたり、データベースに保存したりしないでください。」-- http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx

于 2013-09-03T16:14:23.480 に答える