-3

研究開発の後、私はこの欠陥の解決策を見つけられませんでした。この欠陥を解決するために私を導いてください

説明
このデータベース クエリには、SQL インジェクションの欠陥が含まれています。関数呼び出しは、ユーザー提供の入力から派生した変数を使用して、動的 SQL クエリを構築します。攻撃者はこの欠陥を悪用して、データベースに対して任意の SQL クエリを実行する可能性があります。

推奨事項
SQL クエリを動的に構築することは避けてください。代わりに、パラメータ化されたプリペアド ステートメントを使用して、データベースがバインド変数の内容をクエリの一部として解釈しないようにします。可能な場合は集中型のデータ検証ルーチンを使用して、ユーザー提供の入力を常に検証して、期待される形式に準拠していることを確認します。

public void EditUser(User f)
{
    string connectionString 
        = ConfigurationSettings.AppSettings["ConnectionString"];

    SqlConnection conn = new SqlConnection(connectionString);

    SqlCommand cmd = conn.CreateCommand();
    string adm = (f.IsAdmin?"1":"0");
    string phone="",email="";

    if(f.PhoneList.Count > 0)
       phone = f.PhoneList[0].ToString();

    if(f.EmailList.Count > 0)
       email = f.EmailList[0].ToString();

    for(int i = 1; i < f.PhoneList.Count; i++)
       phone = phone + ";" + f.PhoneList[i].ToString();

    for(int i = 1; i < f.EmailList.Count; i++) 
       email = email + ";" + f.EmailList[i].ToString();

    cmd.CommandText = "UPDATE Users SET  is_admin="+adm+",login='"+f.Login+"',passwd='"+f.Password+
             "',firstname='"+f.FirstName+"',lastname='"+f.LastName+"',email='"+email+"',phone='"+phone+"',address='"+f.Address+"' where user_id="+f.UserId;

    conn.Open();
    int affected = cmd.ExecuteNonQuery();
    cmd.ExecuteNonQuery();
}
4

1 に答える 1

5

コードは、文字列を一緒に追加することによって SQL コマンドを構築します

    cmd.CommandText 
        = "UPDATE Users SET  is_admin="+adm+",login='"+f.Login+"',passwd='"+f.Password+
         "',firstname='"+f.FirstName+"',lastname='"+f.LastName+"',email='"+email+"',phone='"+phone+"',address='"+f.Address+"' where user_id="+f.UserId;

誰かがあなたの関数を呼び出して、User値がlastname等しいと仮定します

"Presser';DROP TABLE Users --"

SQL コマンドは、Users テーブルを破棄します。

MSDN がこの問題を回避する方法を説明している hereを参照してください。

于 2015-07-17T06:14:12.843 に答える