2012-03-26 34 views
5

Tôi đang sử dụng Bản ghi hoạt động trên CodeIgniter. Tôi đang bối rối về cách tiếp cận tôi nên dùng. Hiện tại, hệ thống đăng nhập của chúng tôi cho phép người dùng sử dụng tên người dùng/email cho thông tin đăng nhập cùng với mật khẩu. Nhưng bản ghi hoạt động hiện tại của tôi, dường như cho phép người dùng đăng nhập nếu anh ta chọn sử dụng email + không có mật khẩu.bản ghi hoạt động của người ký mã đang ở đâu, hoặc ở đâu?

Ngay bây giờ đây là câu hỏi của tôi:

$this->db->select('id,level,email,username'); 
$this->db->where('email',$user); 
$this->db->or_where('username',$user); 
$this->db->where('password',$pass); 
$query = $this->db->get('users'); 

if($query->num_rows>0) 
    return TRUE; 
else 
    return FALSE; 

mẫu đầu vào:

  • Tên đăng nhập: kiểm tra | Mật khẩu: vượt qua | Kết quả: Thành công
  • Tên người dùng: kiểm tra | Mật khẩu: trống | Kết quả: Không thành công
  • Tên người dùng: [email protected] | Mật khẩu: vượt qua | Kết quả: Success
  • Tên đăng nhập: [email protected] | Mật khẩu: trống | Kết quả: Success

Các đầu vào thử nghiệm thứ tư phải Không trong kết quả, nhưng có vẻ như nó ghi lại sử dụng ngay cả khi mật khẩu trống.

Trả lời

17

Vấn đề có thể là bạn cần thêm dấu ngoặc khi trộn AND và OR trong mệnh đề WHERE. Hãy thử điều này:

$this->db->select('id,level,email,username'); 
$this->db->where("(email = '$user' OR username = '$user') 
        AND password = '$pass'"); 
$query = $this->db->get('users'); 
+0

Tuyệt vời! Cảm ơn bạn đã trả lời nhanh này. –

+13

không đánh bại mục đích của hồ sơ hoạt động và mở ứng dụng cho SQL injection? –

4

@RidIculous là đúng. Đây là một cách chính xác để làm điều đó:

$user = $this->db->escape($user); 
$this->db->select('id,level,email,username'); 
$this->db->where("(email = $user OR username = $user)"); 
$this->db->where('password', $pass); 
$query = $this->db->get('users'); 

Hoặc một định dạng tôi thích (PHP 5+)

$user = $this->db->escape($user); 
$query = $this->db 
    ->select('id,level,email,username') 
    ->where("(email = $user OR username = $user)") 
    ->where('password', $pass) 
    ->get('users'); 
+0

Tôi đang thoát nó trên truy vấn – Tumtum

+0

D'oh! :-(Xin lỗi! –

0
$conditions = '(`username`="'.$username.'" OR `email`="'.$email.' OR `mobile`="'.$mobile.'"') AND `password`="'.$password.'"';   
$query = $this->db->get_where('table_name', $conditions); 
$result = $query->result(); 
+1

Trong khi đoạn mã này có thể giải quyết được vấn đề, nó không giải thích lý do tại sao hoặc cách nó trả lời câu hỏi. Vui lòng [đưa ra giải thích cho mã của bạn] (// meta.stackexchange.com/q/114762/ 269535), vì điều đó thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do đề xuất mã của bạn. ** Người gắn cờ/người đánh giá: ** [ Đối với các câu trả lời chỉ có mã, chẳng hạn như câu trả lời này, ghi đè, đừng xóa!] (// meta.stackoverflow.com/a/260413/2747593) –

Các vấn đề liên quan