2011-12-17 30 views
6

Tôi đã tạo một hệ thống đăng nhập bằng cách sử dụng các phiên PHP.Phiên đăng nhập này có an toàn không?

Dưới đây là cách hoạt động:

1.) khi người dùng đăng nhập (với các thông tin đăng nhập hợp lệ): thông tin của họ (usernamepassword) đều được lưu trữ trong một phiên, cùng với một vài bit khác thông tin: The Expire time: Đây chỉ là 5 phút thêm vào thời điểm hiện tại (vì vậy nếu người dùng đăng nhập là lúc 22:30 thời gian sẽ hết hạn 22:35).

2.) Trên mỗi lượt xem trang của người dùng đang đăng nhập: Phiên được kiểm tra xem có tồn tại hay không. Nếu không, người dùng sẽ được chuyển hướng đến trang đăng nhập. Nếu phiên không tồn tại, nó sẽ kiểm tra expire time và so sánh nó với current time. Nếu expire time là hơn thì current time (người dùng đã không hoạt động cho 5 + phút) sau đó chi tiết người dùng của họ (trong phiên) được kiểm tra (so với những người trong cơ sở dữ liệu) và phiên Expiretime được cập nhật, nhưng nếu expire time ít sau đó là current time, Nó sẽ không kiểm tra bất kỳ chi tiết nào, cập nhật phiên expire time và sẽ cho phép người dùng tiếp tục. Tôi đã làm điều đó để ngăn chặn truy vấn liên tục trên DB để tiết kiệm băng thông. Vì vậy, về cơ bản, khi người dùng đăng nhập thành công, tên người dùng và mật khẩu của họ sẽ không được kiểm tra lại trên DB cho đến khi họ trở thành không hoạt động (ở lại một trang) trong 5 phút hoặc nếu họ đăng xuất.

quên đề cập đến một cái gì đó chàng trai: Các hết hạn thời gian phiên được thực sự gọi là expire_time_unique_characters ($_SESSION['expire_time_'.$unique_nu]) có nghĩa là người ác cũng sẽ phải tìm ra $unique_nu khi giả mạo phiên ...

tôi chỉ có cảm giác này không an toàn lắm.

Ngoài ra, các dự án này là dành cho là mã nguồn mở (mọi người có thể xem mã nguồn) để đặt ra một nguy cơ còn cao hơn ở đây ...

có thể các bạn cho tôi một số thông tin phản hồi?

Cảm ơn

+0

Tại sao lưu trữ kết hợp người dùng/mật khẩu trên máy chủ trong văn bản rõ ràng? Làm thế nào là _that_ nghĩa vụ phải cải thiện an ninh? Nếu người dùng/mật khẩu đã sai, hơn phiên sẽ không được thiết lập ở nơi đầu tiên, phải không? –

+0

@Niklas Phiên sẽ chỉ được tạo khi đăng nhập thành công đã được hoàn thành. –

+0

Sau đó, bạn không cần phải kiểm tra lại kết hợp đăng nhập sau mỗi vài phút. Chỉ cần không lưu trữ tên người dùng/mật khẩu trên máy chủ. Ngoài ra, đừng lưu trữ chúng trong cơ sở dữ liệu! Sử dụng một thuật toán băm mạnh cho điều này (tốt nhất với kéo dài khóa) –

Trả lời

0

$_SESSION là tương đối an toàn, với điều kiện nó được sử dụng đúng. Ví dụ, nếu bạn giữ các tệp phiên bên dưới gốc web, chúng không thể được truy cập ngoại trừ một người có quyền truy cập trực tiếp vào hệ thống tệp của máy chủ. Vì lý do này, bạn vẫn muốn giữ mật khẩu được mã hóa, nhưng tên người dùng trong văn bản thuần túy là hoàn toàn tốt đẹp.

Giữ ID phiên trong một cookie thay vì sử dụng phương pháp chuỗi truy vấn, nếu không có ai sao chép URL sẽ vô tình chia sẻ phiên của họ và bỏ qua đăng nhập.

Đó về nên làm điều đó. Rõ ràng nếu ai đó đang xâm nhập mạng của người dùng và lấy dữ liệu cookie thì họ có thể sử dụng nó để giả vờ là người dùng, nhưng hầu như không có gì bạn có thể làm về điều đó. Bạn có thể làm cho nó khó hơn (yêu cầu chuỗi Tác nhân Người dùng giống nhau), nhưng cuối cùng bạn không thể làm gì nếu mạng của người dùng bị xâm nhập. Bạn không phải chịu trách nhiệm bảo vệ mạng của họ, chỉ có dữ liệu của họ trên máy chủ của bạn. ID

+0

Lưu ý rằng https sẽ khắc phục tình trạng cookie (mặc dù nó nằm ngoài phạm vi của câu hỏi, và https sẽ vẫn gặp sự cố). – Corbin

+0

Tôi quên cũng đề cập đến một cái gì đó trong câu hỏi. Bạn có thể kiểm tra chỉnh sửa của tôi không? –

+0

Không tạo sự khác biệt. Quyền truy cập vào '$ _SESSION' được xác định bởi cookie' PHPSESSID' (tên mặc định) được trình duyệt đưa ra. –

2

lưu trữ của người dùng trong phiên là quá đủ.

Tuy nhiên, bạn nên thực hiện một số loại bảo vệ chống lại phiên cố định/tặc.

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