Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL कनेक्शन अशक्त संदर्भ फेंकता है

यह NullReferenceException का उत्तर नहीं है - हम अभी भी टिप्पणियों में इसके माध्यम से काम कर रहे हैं; यह सुरक्षा भागों के लिए प्रतिक्रिया है।

पहली चीज़ जो हम देख सकते हैं वह है SQL इंजेक्शन; इसे ठीक करना बहुत आसान है - नीचे देखें (ध्यान दें कि मैंने कुछ अन्य चीजें भी ठीक कर ली हैं)

// note: return could be "bool" or some kind of strongly-typed User object
// but I'm not going to change that here
public string[] GetValidUser(string dbUsername, string dbPassword)
{
    // no need for the table to be a parameter; the other two should
    // be treated as SQL parameters
    string query = @"
SELECT id,email,password FROM tbl_user
WHERE [email protected] AND [email protected]";

    string[] resultArray = new string[3];

    // note: it isn't clear what you expect to happen if the connection
    // doesn't open...
    if (this.OpenConnection())
    {
        try // try+finally ensures that we always close what we open
        {
            using(MySqlCommand cmd = new MySqlCommand(query, connection))
            {
                cmd.Parameters.AddWithValue("email", dbUserName); 
                // I'll talk about this one later...
                cmd.Parameters.AddWithValue("password", dbPassword); 

                using(MySqlDataReader dataReader = cmd.ExecuteReader())
                {
                    if (dataReader.Read()) // no need for "while"
                                           // since only 1 row expected
                    {
                        // it would be nice to replace this with some kind of User
                        //  object with named properties to return, but...
                        resultArray[0] = dataReader.GetInt32(0).ToString();
                        resultArray[1] = dataReader.GetString(1);
                        resultArray[2] = dataReader.GetString(2);

                        if(dataReader.Read())
                        { // that smells of trouble!
                            throw new InvalidOperationException(
                                "Unexpected duplicate user record!");
                        }
                    }
                }
            }
        }
        finally
        {
            this.CloseConnection();
        }
    }
    return resultArray;
}

अब, आप सोच रहे होंगे कि "यह बहुत अधिक कोड है" - निश्चित; और इसके साथ मदद करने के लिए उपकरण मौजूद हैं! उदाहरण के लिए, मान लीजिए हमने किया:

public class User {
    public int Id {get;set;}
    public string Email {get;set;}
    public string Password {get;set;} // I'll talk about this later
}

फिर हम dapper का उपयोग कर सकते हैं और LINQ हमारे लिए सभी भारी भार उठाने के लिए:

public User GetValidUser(string email, string password) {
    return connection.Query<User>(@"
SELECT id,email,password FROM tbl_user
WHERE [email protected] AND [email protected]",
      new {email, password} // the parameters - names are implicit
    ).SingleOrDefault();
}

यह सब कुछ करता है आपके पास (कनेक्शन को सुरक्षित रूप से खोलने और बंद करने सहित) है, लेकिन यह इसे साफ और सुरक्षित रूप से करता है। यदि यह विधि एक null लौटाती है User . के लिए मान , इसका मतलब है कि कोई मिलान नहीं मिला। यदि एक गैर-शून्य User उदाहरण लौटा दिया गया है - इसमें केवल नाम-आधारित सम्मेलनों का उपयोग करके सभी अपेक्षित मान शामिल होने चाहिए (अर्थ:संपत्ति के नाम और स्तंभ नाम मेल खाते हैं)।

आप देख सकते हैं कि केवल वही कोड बचा है जो वास्तव में उपयोगी कोड . है - यह उबाऊ नलसाजी नहीं है। डैपर जैसे टूल आपके मित्र हैं; उनका उपयोग करें।

आखिरकार; पासवर्ड। आपको कभी भी पासवर्ड स्टोर नहीं करना चाहिए। कभी। एक बार भी नहीं। एन्क्रिप्टेड भी नहीं। कभी नहीँ। आपको केवल . चाहिए स्टोर हैश पासवर्ड का। इसका मतलब है कि आप उन्हें कभी भी पुनः प्राप्त नहीं कर सकते। इसके बजाय, आपको हैश करना चाहिए जो उपयोगकर्ता आपूर्ति करता है और इसकी तुलना पहले से मौजूद हैश मूल्य से करें; अगर हैश मैच:वह एक पास है। यह एक जटिल क्षेत्र है और इसमें महत्वपूर्ण परिवर्तनों की आवश्यकता होगी, लेकिन आपको यह करना चाहिए . यह महत्वपूर्ण है। इस समय आपके पास जो है वह असुरक्षित है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जाँच करें कि क्या डालने से पहले डेटाबेस में पंक्ति मौजूद है

  2. एसवीजी मानचित्र पर क्लिक करने से एसक्यूएल से डेटा प्रदर्शित करना

  3. mysql में सही innodb_log_file_size सेट करना

  4. MYSQL में SUM समस्या वाली तालिकाओं में शामिल हों

  5. तालिका में स्ट्रिंग डेटा को पंक्ति में अलग-अलग कॉलम डेटा के रूप में कैसे सम्मिलित करें?