Short
Работа с системой входа в систему и попытка реализовать функцию запоминания меня.Правильный способ использования функции «Запомнить меня» в PHP
Недавно я провел исследование по этому предмету, прочитал кучу статей, постов, рассказов, романов, сказок (называя их так, потому что некоторые из них не содержат даже 1 строки кода, просто нагрузок слов) о, печенье уязвимостей, таких как фиксация, угон ... и т.д.
и решили достичь следующих целей
- чтобы установить время задержки между попытками входа в систему (для предотвращения BruteForce атак) и ограничить кол попытки
- Чтобы восстановить идентификатор сеанса почти во всех операциях
Но Я действительно смущен своей главной проблемой: какой способ является правильным, для функции «помнить меня»? использовать файлы cookie/сеанс/базу данных?
И, пожалуйста, объясните вашу идею о коде. (Я не могу четко понимать без кода)
Подробное
В настоящее время мой код выглядит, что
Во время входа в Я использую следующие функции для установки куки и сессии
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;
}
Затем на защищенных страницах пользователей, проверяя user_id
с помощью user_id, чтобы принести все важные данные о пользователе из БД
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();
}
}
}
Просто комментарий: с точки зрения UX, я думаю, что это хороший момент, чтобы ваши пользователи узнали, имеете ли вы «держать меня в системе» или просто «помните мою личность». – PapaFreud
Возможный дубликат: http://stackoverflow.com/questions/244882/what-is-the-best-way-to-implement-remember-me-for-a-website – ThinkingMonkey
@ThinkingMonkey ok, you'r cool :) –