Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Kết nối MySQL ném tham chiếu rỗng

Đây không phải là câu trả lời cho NullReferenceException - chúng tôi vẫn đang giải quyết vấn đề đó trong các nhận xét; đây là phản hồi cho các bộ phận bảo mật.

Điều đầu tiên chúng ta có thể xem xét là SQL injection; điều này rất dễ sửa - hãy xem bên dưới (lưu ý rằng tôi cũng đã thu dọn một số thứ khác)

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

Bây giờ, bạn có thể nghĩ "đó là quá nhiều mã" - chắc chắn; và các công cụ tồn tại để trợ giúp điều đó! Ví dụ:giả sử chúng tôi đã làm:

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

Sau đó, chúng tôi có thể sử dụng dapper và LINQ để thực hiện tất cả các công việc nặng nhọc cho chúng tôi:

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

Điều này làm được mọi thứ bạn có (bao gồm cả việc mở và đóng kết nối một cách an toàn), nhưng nó thực hiện một cách sạch sẽ và an toàn. Nếu phương thức it trả về null giá trị cho User , nó có nghĩa là không có kết quả phù hợp nào được tìm thấy. Nếu người dùng User thể hiện được trả về - nó phải chứa tất cả các giá trị mong đợi chỉ bằng cách sử dụng các quy ước dựa trên tên (nghĩa là:tên thuộc tính và tên cột khớp nhau).

Bạn có thể nhận thấy rằng mã duy nhất còn lại là mã thực sự hữu ích - nó không phải là hệ thống ống nước nhàm chán. Các công cụ như dapper là bạn của bạn ; sử dụng chúng.

Cuối cùng; mật khẩu. Bạn không bao giờ nên lưu trữ mật khẩu. Bao giờ. Dù chỉ một lần. Thậm chí không được mã hóa. Không bao giờ. Bạn nên chỉ cửa hàng băm mật khẩu. Điều này có nghĩa là bạn không bao giờ có thể lấy chúng. Thay vào đó, bạn nên băm những gì người dùng cung cấp và so sánh nó với giá trị băm đã có từ trước; nếu hàm băm khớp:đó là vượt qua. Đây là một lĩnh vực phức tạp và sẽ cần những thay đổi đáng kể, nhưng bạn nên làm điều này . Cái này quan trọng. Những gì bạn có vào lúc này là không an toàn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách biết kết quả từ bảng nào khi sử dụng UNION trong MySQL

  2. Tương đương với lệnh spool trong MySQL là gì?

  3. Phê bình thiết kế cơ sở dữ liệu MySQL của tôi cho các trường động không giới hạn

  4. Cách tạo một chuỗi với các ký tự đứng đầu / sau trong MySQL - LPAD (), RPAD ()

  5. Làm thế nào để tự cập nhật PHP + MySQL CMS?