Ngắn
Làm việc trên hệ thống đăng nhập và cố gắng triển khai tính năng nhớ tôi. Gần đây, tôi đã nghiên cứu về chủ đề này, đọc rất nhiều bài báo, bài viết, truyện, tiểu thuyết, truyện cổ tích (gọi chúng như vậy, bởi vì một số trong số chúng không chứa 1 dòng mã, chỉ cần tải từ). về, lỗ hổng Cookie như cố định, chiếm quyền điều khiển ... vvCách thích hợp để sử dụng chức năng "Nhớ thông tin đăng nhập của tôi" trong PHP
và quyết định để đạt được các mục tiêu sau đây
- để thiết lập thời gian trễ giữa nỗ lực đăng nhập (để ngăn chặn các cuộc tấn công bruteforce) và để hạn chế những nỗ lực đếm
- Để tạo lại id phiên trên gần như mọi hoạt động
Nhưng Tôi thực sự bối rối về vấn đề chính của mình: cách nào là phù hợp, đối với tính năng "nhớ tôi"? sử dụng cookie/phiên/cơ sở dữ liệu?
Và xin giải thích ý tưởng của bạn vào mã. (Tôi không thể hiểu rõ ràng mà không cần code)
Chi tiết
Hiện nay, mã của tôi trông như thế
Trong khi đăng nhập Tôi đang sử dụng chức năng sau để thiết lập các tập tin cookie và session
protected function validateUser($userid, $ckey=0, $rememmber=0) {
session_start();
session_regenerate_id(true); //this is a security measure
$_SESSION['user_id'] = $userid;
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
if (isset($remember) && $rememmber == 'on') {
setcookie("user_id", $_SESSION['user_id'], time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
setcookie("user_key", sha1($ckey), time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
}
return true;
}
sau đó, trên các trang sử dụng an toàn, kiểm tra user_id
sử dụng user_id để lấy tất cả các quan trọng dữ liệu về người dùng từ db
public function protect() {
session_start();
/* Secure against Session Hijacking by checking user agent */
if (isset($_SESSION['HTTP_USER_AGENT'])) {
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) {
$this->signout();
exit;
}
}
// before we allow sessions, we need to check authentication key - ckey and ctime stored in database
/* If session not set, check for cookies set by Remember me */
if (!isset($_SESSION['user_id'])) {
if (isset($_COOKIE['user_id']) && isset($_COOKIE['user_key'])) {
/* we double check cookie expiry time against stored in database */
$cookie_user_id = $_COOKIE['user_id'];
$stmt = $this->db->prepare("select `ckey`,`ctime` from `users` where `id` =?") or die($this->db->error);
$stmt->bind_param("i", $cookie_user_id) or die(htmlspecialchars($stmt->error));
$stmt->execute() or die(htmlspecialchars($stmt->error));
$stmt->bind_result($ckey, $ctime) or die($stmt->error);
$stmt->close() or die(htmlspecialchars($stmt->error));
// coookie expiry
if ((time() - $ctime) > 60 * 60 * 24 * COOKIE_TIME_OUT) {
$this->signout();
}
/* Security check with untrusted cookies - dont trust value stored in cookie.
/* We also do authentication check of the `ckey` stored in cookie matches that stored in database during login */
if (!empty($ckey) && is_numeric($_COOKIE['user_id']) && $_COOKIE['key'] == sha1($ckey)) {
session_regenerate_id(); //against session fixation attacks.
$_SESSION['user_id'] = $_COOKIE['user_id'];
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
} else {
$this->signout();
}
} else {
if ($page != 'main') {
header('Location:' . wsurl);
exit();
}
}
}
Chỉ cần một bình luận: Từ góc độ UX, tôi nghĩ đó là một điểm tốt để cho người dùng biết liệu bạn có nghĩa là "giữ tôi đăng nhập" hay chỉ "nhớ danh tính của tôi". – PapaFreud
Bản sao có thể xảy ra: http://stackoverflow.com/questions/244882/what-is-the-best-way-to-implement-remember-me-for-a-website – ThinkingMonkey
@ThinkingMonkey ok, you'r cool :) –