2011-03-15 9 views
2

2つのアクセスレベルを持つログインシステムを作成しようとしています。アクセスレベルが1の場合は「介護者のホームページ」を、レベルが2の場合は「管理者ページ」を受け取ります。ログインフォームには、ユーザーがボタンをクリックしてtryLogin変数がtrueを返すと、データベースのユーザー名と一致するデータベースのアクセス許可がデータベースから取得されたときに、データベースの資格情報に対してユーザー名とパスワードを検証する変数があります。フィールド2つのアクセスレベルを持つログインシステム

フォームのいずれかを読み込む代わりに、無効なログイン資格情報が表示されます。 Iveはこれに取り組むのに長時間を費やしてしまいました。私はこれが問題を十分に説明してくれることを願っています。

public bool tryLogin(string uname, string pword) 
     { 
      MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";"); 
      MySqlCommand cmd = new MySqlCommand("SELECT * FROM Staff WHERE username = '" + uname + "' AND password ='" + pword + "';"); 
      cmd.Connection = con; 
      con.Open(); 
      MySqlDataReader reader = cmd.ExecuteReader(); 



      if (reader.Read() != false) 
      { 
       if (reader.IsDBNull(0) == true) 
       { 
        cmd.Connection.Close(); 
        reader.Dispose(); 
        cmd.Dispose(); 
        return false; 
       } 
       else 
       { 
        cmd.Connection.Close(); 
        reader.Dispose(); 
        cmd.Dispose(); 
        return true; 
       } 
      } 
      else 
      { 

       return false; 

      } 
     } 



private void LoginBT_Click(object sender, EventArgs e) 
     { 


      if (tryLogin(uname.Text, pword.Text) == true) 
      { 
       MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";"); 
       MySqlCommand cmd2 = new MySqlCommand("SELECT access_level FROM Staff WHERE username = '" + uname + "';"); 

       cmd2.Connection = con; 
       con.Open(); 


       MySqlDataReader reader = cmd2.ExecuteReader(); 

       if (cmd2.Equals("1")) 

       { 
        this.Hide(); 
        CarerHomePage CarerHomePage = new CarerHomePage(); 
        CarerHomePage.Show(); 
       } 

       if (cmd2.Equals("2")) 
       { 
        this.Hide(); 
        AdministratorHome AdministratorHome = new AdministratorHome(); 
        AdministratorHome.Show(); 

       } 


       else 
       { 
        MessageBox.Show("Invalid Login Credentials"); 
       } 



      } 

     } 

    } 
} 
+7

! [SQLインジェクション](http://en.wikipedia.org/wiki/SQL_injection)の脆弱性あなたは[Little Bobby Tables](http://xkcd.com/327/)について聞いたことがありますか? – Cameron

+0

@Cameron:lmao。 – Paul

+1

「これに長時間取り組んできました。」と言われると、デバッガを使用していない可能性があります。あなたはVisual Studioの助けなしにこれを書いていますか?もしそうなら、[Visual Studio Express](http://www.microsoft.com/express/)を使ってC#のプログラミングをより快適にすることを考えてください。 –

答えて

1

改善の余地はたくさんありますが、間違った点だけを考えてみましょう。私はあなたが意味を考える

MySqlDataReader reader = cmd2.ExecuteReader(); 
if (cmd2.Equals("1")) // What the fail? 

あなたが忙しいだ問題は、コマンド自体とSQLコマンドの実行結果を比較していることである

object accessCode = cmd2.ExecuteScalar(); 
if (accessCode != null && accessCode != DBNull.Value) 
{ 
    if (accessCode.ToString() == "1") 
    { 
     this.Hide(); 
     CarerHomePage CarerHomePage = new CarerHomePage(); 
     CarerHomePage.Show(); 
    } 
3

SQLインジェクションについて読む必要があります。テキスト

「OR 1 = 1追加してみてください - 。ユーザー名のテキストボックスに

をしてログインしようとしているあなたも、asp.netユーザー管理/役割に建て読ん検討すべきである - それは少し役割ですそれはここであなたによく役立つだろう。ここScottGuから

グッドリンク:

http://weblogs.asp.net/scottgu/archive/2005/10/18/427754.aspx

+0

優れた点がありますが、質問に直接言及していないので、悲しいかな、ここには+1はありませんが、これは間違いなく重要であり、考慮する必要があるとのコメントがあります。 :) – Chris

+1

@Chris - 私は同意しません。 - 最初から任意の「2レベルログイン」システムを導入することで、誰かが尋ねたときにシステムがさらに拡張されてしまいます。いくつかの管理機能にアクセスできる介護者のユーザー。ロールベースの認可は、最初からずっと良い方法です。 – Paddy

+1

ここではPaddyとまったく同意します。自分が何をやっているのか本当に分かるまでは、自分のものを掻き集めるのではなく、実証済みのフレームワークを使ってセキュリティを確保するのが最善の方法だと思います。 –

3

あなたの問題は、あなたがstringcmd2ExecuteReaderのインスタンス)を比較することをあるように思われます。なぜこれが本当であるべきですか?クエリの結果をクエリコマンドではなく文字列にチェックする必要があります。

また、CarrerHomePageがロードされていてもif文がメッセージボックスを表示します。この方法で試してください:

  if (cmd2.Equals("1")) 
      { 
       this.Hide(); 
       CarerHomePage CarerHomePage = new CarerHomePage(); 
       CarerHomePage.Show(); 
      } 
      else if (cmd2.Equals("2")) 
      { 
       this.Hide(); 
       AdministratorHome AdministratorHome = new AdministratorHome(); 
       AdministratorHome.Show(); 

      } 
      else 
      { 
       MessageBox.Show("Invalid Login Credentials"); 
      } 
+0

ああ、それに殴られた。あなたは私のことよりもずっと良い点をいくつか作りましたが、あなたは私も愚かに見えなくなりました。 ;-) – Chris

1

ええ、ここには多くの問題があります。常にパラメータ化されたクエリを使用する必要があります。

問題は、DataReaderを使用して結果行を取得する代わりに、cmd.Equalsを使用していることです。

単一の値を取得する場合は、ExecuteScalarを使用することができます。 MySqlCommand上のDocをかなり徹底的に読むことをお勧めします。

最後に、ブロックを使用してオブジェクトをラップすることができます。これにより、自動的にオプションが閉じられ、処分されます。コードを短くする

public bool tryLogin(string uname, string pword) 
{ 
    using(MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";")) 
    using(MySqlCommand cmd = new MySqlCommand("SELECT * FROM Staff WHERE username = @name AND password = @pwd;")) 
    { 
     cmd.Parameters.AddWithValue("@name", uname); 
     cmd.Parameters.AddWithValue("@pwd", pword); 
     cmd.Connection = con; 
     cmd.Connection.Open();    
     using(var reader = cmd.ExecuteReader()) 
     { 
      return reader.Read() && !reader.IsDBNull(0));     
     } 
    } 
} 



private void LoginBT_Click(object sender, EventArgs e) 
{ 
    if (tryLogin(uname.Text, pword.Text)) 
    { 
     using(MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";")) 
     using(MySqlCommand cmd2 = new MySqlCommand("SELECT access_level FROM Staff WHERE username = '" + uname + "';")) 
     { 
      cmd2.Connection = con; 
      cmd2.Connection.Open();     

      using(MySqlDataReader reader = cmd2.ExecuteReader()) 
      { 
       if(reader.Read()) 
       { 
        var accessLevel = reader.GetInt32("access_level"); 
        switch(accessLevel) 
        { 
         case 1: 
          this.Hide(); 
          CarerHomePage CarerHomePage = new CarerHomePage(); 
          CarerHomePage.Show(); 
          break; 
         case 2: 
          this.Hide(); 
          AdministratorHome AdministratorHome = new AdministratorHome(); 
          AdministratorHome.Show(); 
          break; 
         default: 
          MessageBox.Show("Invalid Login Credentials"); 
          break; 
        } 
       } 
      } 
     } 
    } 

} 
0

確かに、資格情報が間違っている場合は、試しログインブールが正しく動作することを確認できます。 メッセージボックスが表示されます。しかし、私の資格情報が正しい場合、フォームのどれもが私がaccess_levelに入れたものに関係なくロードされません。それはゆっくりと進んでいて、デバッガの使用に関するいくつかのチュートリアルを進んでいます。私の目ああ

ます。private void LoginBT_Click(オブジェクト送信者、EventArgsの電子) {

 if (tryLogin(uname.Text, pword.Text) == true) 
     { 
      using (MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";")) 
      using (MySqlCommand cmd2 = new MySqlCommand("SELECT access_level FROM Staff WHERE username = '" + uname + "';")) 
      { 

       cmd2.Connection = con; 
       con.Open(); 


       object access_level = cmd2.ExecuteScalar(); 

       if (access_level != null && access_level != DBNull.Value) 
       { 
        if (access_level.ToString() == "1") 
        { 
         this.Dispose(); 
         CarerHomePage CarerHomePage = new CarerHomePage(); 
         CarerHomePage.Show(); 
        } 


        else if (access_level.ToString() == "2") 
        { 
         this.Dispose(); 
         AdministratorHome AdministratorHome = new AdministratorHome(); 
         AdministratorHome.Show(); 
        } 




       } 

      } 



     } 
     else 
     { 
      MessageBox.Show("Invalid Login Credentials"); 
     } 
} 

} 

}

+0

+ uname.text +理由がありました。 –

関連する問題