Corto
Trabajando en el sistema de inicio de sesión y tratando de implementar la función Recordarme.Forma correcta de utilizar la funcionalidad "Recordarme" en PHP
Recientemente, investigué sobre este tema, leí un montón de artículos, publicaciones, historias, novelas, cuentos de hadas (llamándolos así, porque algunos de ellos no contienen ni siquiera 1 línea de código, solo un montón de palabras) aproximadamente, las vulnerabilidades de galletas tales como la fijación, el secuestro ... etc
y decidió para lograr los objetivos siguientes
- para establecer el retardo de tiempo entre intentos de conexión (para evitar ataques de fuerza bruta) y al límite de recuento de intentos
- Para regenerar la identificación de la sesión en casi todas las operaciones
Pero Realmente me confundí sobre mi problema principal: ¿cuál es la manera adecuada, para la función "recordarme"? usar cookies/sesión/base de datos?
Y por favor explicar su idea en código. (No puedo entender claramente sin código)
detallada
Actualmente, mi código es el que
Durante el inicio de sesión en el que estoy usando siguiente función para configurar las cookies y sesiones
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;
}
a continuación, en las páginas de usuario seguras, la comprobación de user_id
usando user_id a buscar todos los importantes los datos sobre el usuario de 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();
}
}
}
Solo un comentario: desde la perspectiva de UX, creo que es un buen punto que los usuarios sepan si quieres decir "mantenerme conectado" o simplemente "recordar mi identidad". – PapaFreud
Un posible duplicado de: http://stackoverflow.com/questions/244882/what-is-the-best-way-to-implement-remember-me-for-a-website – ThinkingMonkey
@ThinkingMonkey ok, eres genial :) –