0

ログインフォームが必要な C# アプリケーションを開発しています。ユーザーとパスワードは SQL Server データベースに保存されます。

Functionを使用してCodePasspassword をコーディングします。以前にユーザーを追加し、コード化されたパスワードをデータベースに追加しました (ユーザー、パスワード、およびログイン ロールはデータベースに保存されます)。

今、このようにdoLogin関数を呼び出すと

doLogin("Arashdn","123");

0 (間違ったユーザーまたはパスワード) を返します アプリケーションをデバッグした後、hash(暗号化されたパスワードをデータベースから読み取るための変数) が 123 暗号化されていないパスワードを保持していることがわかりました。

問題は何ですか?

ここに私のコードがあります:

public class DB
{
    public static string constr = "Server=localhost;Database=University;
    Integrated Security=true;MultipleActiveResultSets=True;";
    public static string userTable = "Users", userPassword = "Passwd", 
    userName = "UserID", loginRole = "Role";
}

public class login
{
    public int doLogin(string user, string pass)
    {
        string role="0";
        SqlConnection conn = new SqlConnection(DB.constr);
        try
        {
            conn.Open();
            SqlCommand my_cm = conn.CreateCommand();
            SqlDataReader dbread1;
            my_cm.CommandText = "Select " + DB.userPassword + " from " + 
                DB.userTable + " WHERE " + DB.userName + "=" + user;
            dbread1 = my_cm.ExecuteReader();
            string hash="";

            while (dbread1.Read())
            {
               hash = dbread1[0].ToString();
            }

            if (CodePass(user, pass) == hash)
            {
                SqlCommand my_cm2 = conn.CreateCommand();
                SqlDataReader dbread2;
                my_cm2.CommandText = "Select " + DB.loginRole + " from " + 
                DB.userTable + " WHERE " + DB.userName + "=" + user;
                dbread2 = my_cm2.ExecuteReader();

                while (dbread2.Read())
                {
                   role = dbread2[0].ToString(); 
                }
            } 
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (conn.State == System.Data.ConnectionState.Open)
                    conn.Close();
        }

        return int.Parse(role);
    }

    public string CodePass(string user, string pass)
    {
        System.Security.Cryptography.SHA1CryptoServiceProvider sha = 
              new SHA1CryptoServiceProvider();
        return System.Text.Encoding.ASCII.GetString(
          sha.ComputeHash(System.Text.Encoding.ASCII.GetBytes(user + pass)));
    }
}

ありがとう

4

3 に答える 3

2

おそらく、データベースにユーザー名に一致するレコードが少なくとも 2 つあり、そのうちの 1 つはパスワードが「123」である可能性があります。

SqlManager から、次の結果を確認します。ユーザー名を置き換えることを忘れないでください。

select userID,passwd from Users where userId= '<put the username here>';

SqlParameters を使用して Sql インジェクション攻撃を回避し、オブジェクトを適切に破棄するように、既存のコードを書き直すことができます。さらに、以下のように、ほとんどのロジックを単一のデータベース クエリに移動できます。

ユーザーとパスワードが正しくない場合、この変更は 0 を返します。例外をスローするか、代わりに別の値を返すことができます。

public class DB
{
    public static string constr = "Server=localhost;Database=University; Integrated Security=true;MultipleActiveResultSets=True;";
    public static string userTable = "Users", userPassword = "Passwd", 
    userName = "UserID", loginRole = "Role";
}

public class login
{
   public int doLogin(string user, string pass)
   {
      string role="0";
      using (var conn = new SqlConnection(DB.constr) {
        using (var my_cm = conn.CreateCommand() {
         my_cm.CommandText = string.Format(
             "select {0} from {1} where {2} = @username and {3} = @password",
             DB.loginRole,
             DB.userTable,
             DB.userName,
             DB.userPassword);
         my_cm.Parameters.AddWithValue("@username", user);
         mt_cm.Parameters.AddWithValue("@password", CodePass(user,pass));
         using (var dbread = my_cm.ExecuteReader()) {
           if (!dbread.Read()) {
             return 0; // or something else if user not found
           }
           return int.Parse(dbRead[0].ToString());
         }
      }
    }
  }

  public string CodePass(string user, string pass)
  {
    System.Security.Cryptography.SHA1CryptoServiceProvider sha = 
          new SHA1CryptoServiceProvider();
    return System.Text.Encoding.ASCII.GetString(
      sha.ComputeHash(System.Text.Encoding.ASCII.GetBytes(user + pass)));
  }
}
于 2013-06-10T08:46:19.957 に答える
0

コンピューターにSQL Server ExpressとDeveloper Editionの両方があり、SQLServer Developerに別のデータベースがあり、passwdが123で、メインDBがSQLServer Expressであるという問題が見つかりました...

愚かな私

于 2013-06-10T08:46:00.163 に答える