Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Login Form C# and Sql

Îåêßíçóå áðü ôï ìÝëïò Panos.C#. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 31-01-2011, 13:26. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  31-01-2011, 08:21 62827

    Login Form C# and Sql

    Καλημέρα μπορεί κάποιος να με συμβουλέψει γιατι δεν δουλεύει το else.. ευχαριστώ πολύ. ---- private void btnEnter_Click(object sender, EventArgs e) { // Sql String builder SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.DataSource = @".\SqlExpress"; builder.InitialCatalog = "mits"; builder.UserID = "sa"; builder.Password = "sa"; // Sql Connection SqlConnection con = new SqlConnection(); con.ConnectionString = builder.ConnectionString; con.Open(); // Sql Command string userSql = "Select userName, userPassword, userFullName " + " from users " + "Where userName = @userName and userPassword=@userPassword"; SqlCommand com = new SqlCommand(userSql, con); com.Parameters.AddWithValue("@userName", txtUserName.Text); com.Parameters.AddWithValue("@userPassword", txtUserPassword); string userString = txtUserName.Text; string passwordString = txtUserPassword.Text; SqlDataReader rdr = com.ExecuteReader(); while (rdr.Read()) { if (userString == rdr["userName"].ToString() && passwordString == rdr["userPassword"].ToString()) { MessageBox.Show("Ok"); } else { MessageBox.Show("Access Denied"); } } rdr.Close(); con.Close(); }
    breadcrumbs.gr
  •  31-01-2011, 08:47 62830 σε απάντηση της 62827

    Απ: Login Form C# and Sql

    Καλύτερα φτιάξε λίγο τον κώδικα ώστε να είναι ευανάγνωστος, διαφορετικά δε βλέπω να παίρνεις απάντηση...

     


    Vir prudens non contra ventum mingit
  •  31-01-2011, 08:56 62831 σε απάντηση της 62830

    Απ: Login Form C# and Sql

    Καλημέρα μπορεί κάποιος να με συμβουλέψει γιατι δεν δουλεύει το else.. ευχαριστώ πολύ.

     ----

    private void btnEnter_Click(object sender, EventArgs e)

    {

    // Sql String builder

    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();

    builder.DataSource = @".\SqlExpress";
    builder.InitialCatalog = "mits";
    builder.UserID = "sa";
    builder.Password = "sa";

    // Sql Connection
    SqlConnection con = new SqlConnection();
    con.ConnectionString = builder.ConnectionString;
    con.Open();

    // Sql Command
    string userSql = "Select userName, userPassword, userFullName " +
    " from users " +
    "Where userName = @userName and userPassword=@userPassword";

    SqlCommand com = new SqlCommand(userSql, con);
    com.Parameters.AddWithValue("@userName", txtUserName.Text);
    com.Parameters.AddWithValue("@userPassword", txtUserPassword.Text);
    string userString = txtUserName.Text;
    string passwordString = txtUserPassword.Text;
    SqlDataReader rdr = com.ExecuteReader();
    while (rdr.Read())
    {
    if (userString == rdr["userName"].ToString() && passwordString == rdr["userPassword"].ToString())
    {
    MessageBox.Show("Ok");
    }
    else
    {
    MessageBox.Show("Access Denied");
    }
    }
    rdr.Close();
    con.Close();
    }


    breadcrumbs.gr
  •  31-01-2011, 11:14 62835 σε απάντηση της 62831

    Απ: Login Form C# and Sql

    Κάνεις query στην βάση με δυο παραμέτρους και μετά ελέγχεις να δεις αν οι εγγραφές που σου επέστρεψαν έχουν όντως τις επιθυμητές τιμές στα αντίστοιχα πεδία.

     

    Η πραγματική ερώτηση είναι, γιατί θα έπρεπε να παίξει το else; Αν καταφέρεις να απαντήσεις αυτή την ερώτηση θα καταλάβεις το λάθος σου.

    Αν δεν κατάλαβες ήδη την απάντηση και δεν σου αρέσουν οι γρίφοι, τότε δες την απάντηση παρακάτω.

    .

    .

    .

    .

    .

    Query με παραμέτρους κάνεις για να σου φέρει μόνο τις εγγραφές που ταιριάζουν με ότι δίνεις στις παραμέτρους και δεν πρόκειται ποτέ να σου φέρει κάτι άλλο. Δεδομένου φυσικά ότι είναι σωστό το query.

    Στην περίπτωσή σου, αποτυχία σύνδεσης είναι άμα δεν βρει εγγραφές στην βάση οπότε και ο reader επιστρέφει μηδέν εγγραφές. Έλεγξε το rdr.Read(). Αν σου επιστρέψει false τότε δεν βρήκε εγγραφή με τα στοιχεία που έδωσες => αποτυχία σύνδεσης.  

    Πιστεύω ότι θα παρατήρησες ήδη ότι όταν βάζεις λάθος στοιχεία, δεν βλέπεις καθόλου μήνυμα. Δεν φταίει ότι δεν δουλεύει το else αλλά το ότι είναι σε λάθος σημείο.

     

  •  31-01-2011, 13:26 62842 σε απάντηση της 62835

    Απ: Login Form C# and Sql

    Πέρα από το γεγονός ότι αυτό που δεν παίζει είναι το Read, όχι το else, ο τρόπος αυτός ελέγχου password είναι λάθος και επικίνδυνος. Καταρχήν, είναι επικίνδυνο να δίνεις χύμα sql αντί για παραμέτρους. Έτσι μένεις ανοικτός σε sql injection attacks, όπου κάποιος μπορεί να χώσει sql κώδικα μέσα στα πεδία σου. Με το χύμα sql ο κώδικας αυτός θα εκτελεστεί χωρίς πρόβλημα. Δεύτερον, το password δεν πρέπει να αποθηκεύεται ποτέ στη βάση χύμα, γιατί έτσι μπορεί να το διαβάσει οποιοσδήποτε καταφέρει να δει τον πίνακα, π.χ. εκτελώντας ένα sql injection attack. Αντί να αποθηκεύεις χύμα, κάνε Hash το password και αποθήκευσε το hash. Κάθε φορά που ο χρήστης δίνει το username/password, υπολογίζεις το hash του password που σου δίνει και το συγκρίνεις με αυτό που αποθηκεύτηκε. 

    Τέλος, αν μπορείς απλά μην βάζεις login form. Όλες οι Windows εφαρμογές ξέρουν ποιός είναι ο χρήστης που τις εκτελεί, έτσι δεν χρειάζεται να του ζητήσεις να ξαναδώσει Username/password. Τα δικαιώματα του χρήστη περνάνε και στην πρόσβαση σε διάφορα resources, π.χ. πρόσβαση σε αρχεία, σύνδεση στον SQL Server κλπ.   Για τα web applications μπορείς να χρησιμοποιήσεις τον έτοιμο μηχανισμό authentication που έχει το ASP.NET. 

    Μπορείς να βρεις ποιός είναι ο χρήστης σε μία Winforms εφαρμογή με την Windows.Identity.GetCurrent() .  Μπορείς να ελέγξεις σε ποιά group ανήκει ο χρήστης (π.χ. επειδή θέλεις να περιορίσεις ποιοί χρήστες έχουν πρόσβαση στην εφαρμογή) μέσω του Groups property.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems