Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Koneksi MySQL melempar referensi nol

Ini bukan jawaban untuk NullReferenceException - kami masih mengerjakannya di komentar; ini adalah umpan balik untuk bagian keamanan.

Hal pertama yang bisa kita lihat adalah injeksi SQL; ini sangat mudah untuk diperbaiki - lihat di bawah (perhatikan saya telah merapikan beberapa hal lain juga)

// 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;
}

Sekarang, Anda mungkin berpikir "itu terlalu banyak kode" - tentu saja; dan ada alat untuk membantu itu! Misalnya, misalkan kita melakukan:

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

Kami kemudian dapat menggunakan dapper dan LINQ untuk melakukan semua pekerjaan berat untuk kami:

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();
}

Ini melakukan segalanya Anda miliki (termasuk membuka dan menutup koneksi dengan aman), tetapi melakukannya dengan bersih dan aman. Jika metode mengembalikan null nilai untuk User , itu berarti tidak ada kecocokan yang ditemukan. Jika User bukan null instance dikembalikan - itu harus berisi semua nilai yang diharapkan hanya menggunakan konvensi berbasis nama (artinya:nama properti dan nama kolom cocok).

Anda mungkin memperhatikan bahwa satu-satunya kode yang tersisa adalah kode yang benar-benar berguna - itu bukan pipa yang membosankan. Alat seperti dapper adalah teman Anda; menggunakannya.

Akhirnya; kata sandi. Anda tidak boleh menyimpan kata sandi. Pernah. Bahkan tidak sekali. Bahkan tidak dienkripsi. Tidak pernah. Anda harus hanya simpan hash dari kata sandi. Ini berarti bahwa Anda tidak akan pernah dapat mengambilnya kembali. Sebagai gantinya, Anda harus melakukan hash pada apa yang disediakan pengguna dan membandingkannya dengan nilai hash yang sudah ada sebelumnya; jika hash cocok:itu lulus. Ini adalah area yang rumit dan akan membutuhkan perubahan yang signifikan, tetapi Anda harus melakukan ini . Ini penting. Apa yang Anda miliki saat ini tidak aman.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi MySQL LN() – Mengembalikan Logaritma Natural dari suatu Angka

  2. MySQL - menggunakan String sebagai Kunci Utama

  3. Perintah tidak sinkron; Anda tidak dapat menjalankan perintah ini sekarang

  4. Laravel fasih tidak memperbarui kolom JSON:Konversi array ke string

  5. Mengedit kode ulang MySQL menggunakan formulir HTML