2012-10-30 17 views
9

(Tôi đã rất ngạc nhiên khi câu hỏi này không được hỏi trên Stack bây giờ, nhưng tôi đã thực hiện một số tìm kiếm và không thể tìm thấy bất kỳ điều gì oO)Tại sao tôi nên sử dụng id phiên trong cookie thay vì lưu trữ mật khẩu đăng nhập và (băm) trong cookie?

Tôi đang làm việc trên webapp dịch vụ và tôi tự hỏi điều gì là cách tốt nhất để xử lý thông tin đăng nhập của người dùng. Cho đến nay tôi có:

  1. Khi người dùng đăng nhập, họ cung cấp tín dụng. Mật khẩu được ướp muối và băm cục bộ, hơn là nó được truyền tới máy chủ qua POST (do đó người dùng sẽ không thể lấy lại mật khẩu ban đầu. Để kiểm tra chúng trên các trang web khác)
  2. Đăng nhập và mật khẩu băm được lưu trong cookie với TTL trong 15 phút (thu hồi mọi webaction)
  3. Passwod là máy chủ và được băm một lần nữa, và so với mật khẩu được lưu trữ trong cơ sở dữ liệu (vì vậy, mật khẩu được băm đôi với các loại muối khác nhau. vào cơ sở dữ liệu - họ vẫn sẽ không thể khôi phục thông tin đăng nhập)
  4. Người dùng có thể thực hiện tối đa 3 lần đăng nhập mỗi 5 phút từ một IP
  5. Người dùng nhận thông tin về thành công và unsu cuối cùng nỗ lực đăng nhập rất lớn cùng với ngày và IP

Ai đó đã lưu ý rằng tốt hơn để lưu trữ id phiên duy nhất thay vì mật khẩu băm trong cookie và tôi tự hỏi tại sao lại quan trọng như vậy id hay không - họ vẫn có thể nhận được gói từ đăng nhập với tất cả dữ liệu cần thiết để đặt ra làm người dùng hợp pháp và đăng nhập. Vì vậy, có bất kỳ lợi thế khác của phương pháp tiếp cận session-id được lưu trữ trên lưu trữ đăng nhập và băm mật khẩu trong thẩm định cookie?

Trả lời

11

Lưu trữ mật khẩu được băm dưới dạng cookie là lỗ hổng rất khó chịu và là OWASP Violation. Toàn bộ điểm trong băm mật khẩu là bạn đang buộc kẻ tấn công phá vỡ băm để đăng nhập. Nếu kẻ tấn công chỉ có thể kéo băm từ cơ sở dữ liệu và sau đó đăng nhập, thì bạn có một hệ thống tương đương với lưu trữ mật khẩu trong văn bản thuần túy.

Mọi nền tảng đều có trình xử lý phiên, trong php chỉ sử dụng session_start() và siêu $ _SESSION toàn cầu. Bằng cách viết trình xử lý phiên của riêng bạn, bạn sẽ ít an toàn hơn.

+0

Tôi đang khôi phục lại mật khẩu một lần nữa, phía máy chủ. Có mật khẩu băm đôi trong cơ sở dữ liệu, vì vậy bạn không thể nhận được mật khẩu băm đơn, được yêu cầu để đăng nhập – PiotrK

+3

@PiotrK của nó vẫn là một ý tưởng khủng khiếp, không viết trình xử lý phiên của riêng bạn. – rook

+0

Tôi muốn mô tả vấn đề của mình là có thể hữu ích cho cộng đồng - nhưng tình huống có phần khác: Tôi đang sử dụng Flash làm ứng dụng khách và thực hiện cuộc gọi HTTP và nhận dữ liệu bằng XML thuần túy. Tôi không thể sử dụng phiên tiêu chuẩn, bởi vì tôi không có GET hoặc COOKIE trong mã của tôi.Tôi chỉ đề cập đến các biến được khách hàng Flash lưu giữ là "cookie", vì chúng hoạt động như vậy. Đó là lý do tại sao tôi không thể sử dụng trình xử lý phiên PHP và phải viết của riêng tôi :) – PiotrK

4

Bằng cách lưu ID phiên, bạn có thể xác định các phiên khác nhau của cùng một người dùng và bạn có thể xử lý chúng theo bất kỳ cách đặc biệt nào (ví dụ: chỉ cho phép một phiên hoặc có dữ liệu được liên kết với phiên thay vì người dùng).

Và bạn có thể phân biệt hoạt động dễ dàng từ các phiên khác nhau, vì vậy bạn có thể giết phiên mà không phải thay đổi mật khẩu nếu bạn mở nó trong máy tính và các phiên khác sẽ không nhận thấy sự khác biệt.

0

Băm kép không bảo vệ bạn khỏi quá trình khai thác. Nếu một người dùng đã lưu id người dùng và mật khẩu băm từ cookie và gửi đến máy chủ, anh ta sẽ ngay lập tức có quyền truy cập. Với id phiên, ít nhất là thời gian chờ.