2013-01-02 60 views
11

Tôi đang ở giữa mã hóa biểu mẫu đăng nhập 'nhớ tôi', và cho đến nay các hướng dẫn tôi đã đọc (một phần để đảm bảo rằng tôi đang làm đúng) tất cả đều nói để lưu trữ mật khẩu được mã hóa trong một cookie cùng với tên người dùng. Sau đó, mỗi khi PHP kiểm tra nếu người dùng hiện tại không đăng nhập, hãy kiểm tra cookie của họ và tìm những giá trị đó. Nếu tên người dùng khớp với mật khẩu, bạn đang ở.PHP "Remember Me" lỗ hổng bảo mật?

Với tôi, đây là lỗ hổng bảo mật định hình. Nếu ai đó đã hack cơ sở dữ liệu hoặc bằng cách nào đó có quyền truy cập vào các mật khẩu được mã hóa, họ thậm chí sẽ không cần phải crack chúng. Chỉ cần thiết lập cookie của riêng bạn và đi. Tôi có đúng hay chỉ là hoang tưởng?

Hệ thống đăng nhập của tôi sử dụng phiên để theo dõi id người dùng hiện tại và 1/0 cho kiểm tra đăng nhập/đăng xuất nhanh. Người dùng không thể chỉnh sửa phiên AFAIK, vì vậy điều này là an toàn (nếu không, vui lòng cho tôi biết). Tôi đã nghĩ đến việc chỉ lưu trữ ID phiên trong cookie, để sau này tiếp tục nó, nhưng điều đó cũng không an toàn.

Tôi quan tâm nhiều đến bảo mật của người dùng, làm cách nào để bảo vệ thông tin của họ một cách chính xác trong khi vẫn duy trì một trang web hoạt động?

+0

Tôi sẽ không lưu mật khẩu được mã hóa, chỉ user_ID trong cookie hết hạn sau X ngày. Đối với các khu vực "nhạy cảm" (ví dụ: quản lý tài khoản/hồ sơ), bạn có thể yêu cầu họ đăng nhập nếu họ không có $ _SESSION hợp lệ (bạn nên đặt khi họ đăng nhập). – JennyDanger

+1

Hiện tại bạn đang lưu trữ ID phiên nếu lưu trữ ID trong cookie là "không an toàn"? –

+0

@georgefox hiện tại, tôi không lưu trữ ID phiên trong bất cứ điều gì, tôi chỉ nói rằng đó là khả năng để nhớ chức năng của tôi. – Scott

Trả lời

11

Thông thường khi máy chủ được yêu cầu nhớ người dùng, mà nó tạo ra một cookie thêm bên cạnh cookie phiên bình thường, và chuỗi mới này chứa tên người dùng và một số tiền hợp lý của các nhân vật ngẫu nhiên mà làm cho nó unguessable. Điều này rõ ràng được lưu trong cơ sở dữ liệu (vì lý do bảo mật bạn có thể muốn xử lý nó như mật khẩu và do đó muối và băm), và lần sau người dùng kết nối với cùng một trình duyệt (giả sử phiên cũ đã hết hạn), ứng dụng nhận được chuỗi ngẫu nhiên, kiểm tra cơ sở dữ liệu, và nếu có một kết hợp người dùng được xác thực.

Cách khác là di chuyển thời gian hết hạn phiên trước một số tiền.

Các lỗ hổng bảo mật ở đây là gì? Với điều kiện bạn sử dụng một trình tạo ngẫu nhiên tốt, điều duy nhất có thể xảy ra là người dùng truy cập ứng dụng từ một trình duyệt được chia sẻ và không tự đăng xuất khi nó kết thúc.

Các quy tắc bình thường luôn luôn áp dụng kể từ khi bạn đang ở trên một kênh không an toàn: sử dụng HTTPS, nếu không bất cứ ai ngồi ở giữa máy tính và máy chủ có thể ăn cắp cookie (hoặc phiên một hoặc các nhớ-me một) và hành động như thể đó là bạn.

Bonus, this must-read by Jeff Atwood

+0

Điều này có vẻ như là một cách tốt để đi, cảm ơn! Ngoài ra, đọc bài đăng đăng nhập quái vật đó ngay bây giờ! – Scott

-3

Tôi đã gặp vấn đề tương tự khi làm việc trên trang web của riêng mình, cách tốt nhất để giải quyết nó là không nhớ mật khẩu, chỉ tên người dùng, cung cấp nhật ký nhanh hơn nhưng không an toàn hơn. Thực tế là không có cách nào chắc chắn để giữ cho các mật khẩu hoàn toàn an toàn. Bên cạnh các trình duyệt mới, người dùng có thể nhớ trình duyệt của mình.

Nhưng nếu bạn phải có một mật khẩu đã lưu, hãy thử này:

Có nhiều cookie, 2 sẽ là dễ dàng nhất, và sử dụng một cho một mật khẩu được mã hóa, trong khi người kia đã tổ chức một khóa mã hóa. Mật khẩu trong cơ sở dữ liệu sẽ giữ một mật khẩu được mã hóa thêm, thu được bằng cách sử dụng (các) khóa mã hóa được lưu trữ của bạn. Khi bạn đã sẵn sàng để kiểm tra mật khẩu, hãy trích xuất các giá trị và mã hóa mật khẩu.

Hy vọng điều này hữu ích. Chúc may mắn!

Chỉnh sửa: Tôi có thể đã hiểu nhầm điều này, nếu người dùng vẫn đăng nhập, bạn nên lưu trữ biến phiên.

+1

Không bao giờ lưu mật khẩu bằng bất kỳ cách nào (mật khẩu được mã hóa có thể được sử dụng để đăng nhập vẫn là mật khẩu) trên máy khách. Chỉ lưu khóa được lưu trữ trên máy chủ. Các khóa này có thể bị thu hồi sau nhưng mật khẩu được mã hóa sẽ có hiệu lực cho đến khi thay đổi. –

+0

Điều đó không nhất thiết phải đúng bởi vì người ta sẽ đặt ngày hết hạn; tuy nhiên, tôi không muốn sử dụng phương pháp thứ hai của mình. – Zero

0

Nếu bạn muốn nó an toàn, không cho phép người dùng của bạn để giữ cho chúng được đăng nhập.

Khi cài đặt phiên giao dịch, hãy chắc chắn để ràng buộc ipaddress vào session ID, do đó nếu ai đó nhặt lên một phiên sau đó, nó chỉ có thể được thực hiện từ cùng một địa chỉ IP. Bạn có thể thực hiện điều này bằng cách giữ cơ sở dữ liệu với id phiên (băm) id + ipaded băm. Tôi sử dụng chức năng phps http://php.net/manual/en/class.sessionhandler.php để đặt trình xử lý phiên và kết hợp phiên với ipaddresses.

+1

Địa chỉ IP không được sử dụng để bảo mật và bạn không thể tin tưởng địa chỉ IP. Kiểm tra IP, như bạn chỉ ra, vẫn làm cho cuộc sống khó khăn hơn cho những kẻ xấu mặc dù. –

2

Không bao giờ lưu mật khẩu theo bất kỳ cách nào (mật khẩu được mã hóa có thể được sử dụng để đăng nhập vẫn là mật khẩu) trên máy khách.

Sử dụng khóa được tạo ngẫu nhiên, được lưu trữ an toàn trên máy chủ. Các khóa này có thể bị thu hồi sau này, không giống như mật khẩu được mã hóa sẽ có hiệu lực cho đến khi thay đổi.

Sử dụng php bạn có thể tạo khóa ngẫu nhiên như thế này md5(uniqid(mt_rand(), true)). Để lưu trữ an toàn tốt hơn, nó được muối và băm trong db.

Ví dụ bảng:

login_keys (
    user_id int, 
    key char(40), # sha1 
    salt char(15) 
) 

Cũng lưu ý bạn nên kích hoạt HTTP chỉ Cookie tùy chọn.

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