2008-12-31 34 views
18

Tôi đang phát triển một hệ thống đăng nhập dựa trên PHP. Mỗi người dùng có một ID (một số) và một mật khẩu, được lưu trữ dưới dạng băm muối.Hệ thống đăng nhập bằng PHP sử dụng Cookie và Hashes muối

Tôi có thể tìm hiểu xem đăng nhập có thành công hay không, nhưng bây giờ tôi cần lưu trữ thông tin đó ở đâu đó (để người dùng không bị đăng xuất vĩnh viễn).

Trong quá khứ, tôi đã chơi với biến $ _SESSION. Tuy nhiên, chúng dường như bị xóa khi người dùng rời khỏi trình duyệt, điều không mong muốn. Ngoài ra, tôi không thể "giả định" rằng người dùng sẽ không cố gắng lừa hệ thống, vì vậy nó phải được an toàn.

Vì vậy, đây là những câu hỏi của tôi:

  1. Tôi có nên sử dụng $_SESSION hoặc $_COOKIE? Những ưu điểm chính của mỗi phương pháp này là gì?
  2. Cách triển khai hộp kiểm 'Nhớ thông tin đăng nhập của tôi'?
  3. Thông tin nào sẽ được lưu trữ trong biến phiên/cookie?

Lưu ý rằng không có vấn đề bảo mật cơ sở dữ liệu nào đang được xem xét trong câu hỏi cụ thể này.

Về số 3, những gì tôi có nghĩa chính xác là:

  • Tôi có nên lưu trữ các ID và mật khẩu băm của người sử dụng trong cookie/session, hoặc
  • Tôi có nên lưu trữ các ID và phi mật khẩu -hashed của người sử dụng trong cookie/session, hoặc
  • tôi có nên lưu trữ một "SessionID" và mật khẩu (băm hoặc không băm?) hoặc
  • tôi có nên lưu trữ một "SessionID", "ID" và mật khẩu (một lần nữa, băm hoặc không băm)?

Tôi muốn giữ trang web của mình an toàn nhưng hiệu quả và thân thiện với người dùng nhất có thể. Nếu một phương pháp dựa trên SessionID được thực hiện, tôi cũng đánh giá cao một số giải thích về cách lưu trữ nó trong cơ sở dữ liệu.

Cảm ơn bạn trước

EDIT: câu trả lời của Brian kết hợp Eran và dường như những gì tôi cần. Thật không may, tôi chỉ có thể đánh dấu một trong số họ là được chấp nhận. Tôi sẽ cố gắng tiếp tục và thực hiện để xem cái nào hữu ích hơn.

+0

Bạn nên sử dụng lại khung xác thực hiện tại bất cứ khi nào có thể, vì nó * phức tạp *. Ví dụ: hãy xem https://github.com/delight-im/PHP-Auth – caw

Trả lời

9

Tôi muốn nhắc lại điểm của Eran không bao giờ lưu trữ mật khẩu người dùng hoặc thậm chí băm mật khẩu trong dữ liệu phiên hoặc cookie.

Nói chung, tôi đã triển khai chức năng ghi nhớ tôi trong ứng dụng web bằng Cookie. Một nơi tốt để bắt đầu thông tin về việc xây dựng hệ thống đăng nhập liên tục "an toàn" là blog post on the fishbowl này. Câu trả lời chuyên sâu đã được đề cập trong another Stack Overflow answer.

Nếu bạn cần đảm bảo rằng thông tin đăng nhập được bảo mật, bạn phải sử dụng https. Điều này là do cookie hoặc phiên có thể bị đánh cắp nếu chúng không được mã hóa.

Một phương pháp hay khác để làm theo là hệ thống đăng nhập 2 cấp. Bạn có thể thấy điều này tại các trang như Amazon, nơi bạn có thể thêm những thứ vào giỏ hàng của bạn mà không cần đăng nhập nhưng nếu bạn muốn thanh toán hoặc chỉnh sửa tài khoản của mình theo kiểu thời trang, bạn phải nhập lại mật khẩu của mình.

+1

Bài viết tiếp theo này sẽ chuyển đến cấp độ tiếp theo: http://jaspan.com/improved_persistent_login_cookie_best_practice – jmucchiello

+0

@jmucchiello kế hoạch 'được cải thiện' thật không may là tranh luận. Đồng thời đọc: http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication/477579#477579 – Jacco

8

Để biết thông tin nhạy cảm (ví dụ: kết quả xác thực) chỉ sử dụng các phiên. Phiên được lưu trữ phía máy chủ và ít có khả năng bị xâm phạm.

Về tuổi thọ phiên, mặc định là thời gian tồn tại của phiên trình duyệt - nhưng bạn có thể kiểm soát điều đó. Có một số cài đặt ảnh hưởng đến điều đó:

phiên.gc_maxlifetime - kiểm soát hiệu quả tuổi thọ của phiên.

phiên.gc_probability và session.gc_divisor cùng nhau xác định tần suất thu thập dữ liệu phiên sẽ diễn ra.

Và phiên cuối cùng.cookie_lifetime kiểm soát tuổi thọ của cookie phiên (cookie chứa id phiên vì vậy nó không phải được tranmistted qua URL). Nó phải khớp với giá trị của session.gc_maxlifetime.

Ngoài ra, không bao giờ lưu trữ mật khẩu trong phiên hoặc cookie (ngay cả ở định dạng băm). Chỉ cần kết quả xác thực.

0

Lưu ID trong $ _SESSION nhưng không lưu trữ mật khẩu được băm hoặc không băm. Khi người dùng đã đăng nhập và ID được lưu trong $ _SESSION, bạn không cần mật khẩu nữa.

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