¡Creo que he encontrado una solución inteligente!
Las ventajas de este (complicado?) Guión:.
- Cuando el usuario inicia sesión con éxito en con Recordarme comprobado, una cookie de inicio de sesión se emite, además de la gestión de sesiones estándar galletas [2 ]
- La cookie de inicio de sesión contiene el nombre de usuario del usuario, un identificador de serie y un token. La serie y el token son números aleatorios inimaginables de un espacio adecuadamente grande. Los tres se almacenan juntos en una tabla de base de datos.
- Cuando un usuario que no ha iniciado sesión visita el sitio y presenta una cookie de inicio de sesión, el nombre de usuario, la serie y el token se buscan en la base de datos.
- Si la tripleta está presente, el usuario se considera autenticado. El token usado se elimina de la base de datos. Se genera un nuevo token , se almacena en la base de datos con el nombre de usuario y el mismo identificador de serie , y se emite una nueva cookie de inicio de sesión que contiene los tres .
- Si el nombre de usuario y la serie son presentes pero el token no coincide, se supone un robo. El usuario recibe una advertencia muy redactada y todas las sesiones recordadas del usuario son borradas.
- Si el nombre de usuario y la serie no son presentes, se ignora la cookie de inicio de sesión.
He hecho una tabla en la base de datos con la siguiente información:
session | token | username | expire
El me recuerda galletas tendrá esta configuración:
$value = "$session|$token|$userhash"; //Total length = 106
Session
habrá una cadena de 40 (sha1) caracteres.
Token
será una cadena de 32 (md5) caracteres.
Userhash
en la cookie será un cadena de 32 (md5 de nombre de usuario) caracteres.
Username
en la base de datos será el nombre de usuario normal.
Expire
ahora serán + 60 días.
El guión:
if(isset($_SESSION['check']) || $_SESSION['check']){
//User is logged in
}else if(isset($_COOKIE['remember']) && strlen($_COOKIE['remember'])==106){
//THERE is a cookie, which is the right length 40session+32token+32user+2'|'
//Now lets go check it...
conncectdb(); //Sets connection
//How do I protect this script form harmful user input?
$plode = explode('|',$_COOKIE['remember']);
$session = mysql_real_escape_string($plode[0]);
$token = mysql_real_escape_string($plode[1]);
$userhash = mysql_real_escape_string($plode[2]);
$result = mysql_query(" SELECT user
FROM tokens
WHERE session = '$session'
AND token = '$token'
AND md5(user) = '$userhash';")
if(mysql_num_rows($result)==1){
//COOKIE is completely valid!
//Make a new cookie with the same session and another token.
$newusername = mysql_result($result,0,0);
$newsession = $session;
$newtoken = md5(uniqid(rand(), true));
$newuserhash = md5($username);
$value = "$newsession|$newtoken|$newuserhash";
$expire = time()+4184000;
setcookie('remember', $value, $expire, '/', 'www.example.com', isset($_SERVER["HTTPS"]), true);
mysql_query(" UPDATE tokens
SET token='$newtoken', expire='$expire'
WHERE session = '$session'
AND token = '$token'
AND md5(user)='$userhash';");
//Set-up the whole session (with user details from database) etc...
} else if(mysql_num_rows(mysql_query("SELECT user FROM tokens WHERE session = '$session' AND md5(user) = '$userhash';"))==1)){
//TOKEN is different, session is valid
//This user is probably under attack
//Put up a warning, and let the user re-validate (login)
//Remove the whole session (also the other sessions from this user?)
} else {
//Cookie expired in database? Unlikely...
//Invalid in what way?
}
} else {
//No cookie, rest of the script
}
Ventajas de la secuencia de comandos:
- inicio de sesión múltiple. Puede crear nuevas sesiones para cada computadora en la que se encuentre.
- Las cookies y la base de datos se mantendrán limpias. Usuarios activos renuevan su cookie cada inicio de sesión.
- La comprobación de la sesión al principio asegura que la base de datos no recibirá peticiones inútiles.
- Si un atacante roba una cookie, recibe un nuevo token, pero no una nueva sesión . Por lo tanto, cuando el usuario real visita el sitio web con el token viejo (no válido) pero CON una combinación de usuario válida sesión , el usuario recibe una advertencia del posible robo. Después de volver a validar iniciando sesión se crea una nueva sesión y la sesión que tiene el atacante no es válida. La validación de garantiza que la víctima sea realmente la víctima, y no el atacante .
Referencia: http://jaspan.com/improved_persistent_login_cookie_best_practice
Cuéntanos algo sobre tu aplicación que usaría esta característica. ¿Cuál sería el impacto potencial de una suplantación/robo de identidad? – Gumbo
la mayoría de las máquinas cambian la IP todo el tiempo ... – Shoe
la función "recordarme" es insegura por definición. Por lo tanto, depende de usted elegir entre usabilidad y paranoia. –