2011-09-29 12 views
15

Deseo tener una opción de inicio de sesión automático para un usuario. Básicamente eso significa que una cookie se almacenará en el lado del cliente.Diseño de un sistema seguro de cookies de inicio de sesión automático en PHP

Ahora la pregunta es, ¿cómo hago que sea seguro para que la cookie no pueda ser falsificada/modificada.

Uno de mis amigos sugiere tener una tabla db que almacene el session_id, la dirección IP del usuario, la información del navegador, etc. y luego comparar toda esa información una vez que el usuario vaya nuevamente al sitio web.

Tengo ganas de tener una mesa separada para eso es un problema demasiado. ¿Hay alguna otra forma de hacerlo? Tal vez con tokens o algo así?

Respuesta

26

Cuanto más segura es la que desea esta cookie infame, más problemas le ocasionará a usted. Si sus usuarios deben ser particularmente seguros, tendrá que elegir el enfoque más problemático.

Solo debe aceptar esta cookie con https si desea estar lo más seguro posible. Si la cookie es aceptada en http, puede ser olfateada y robada.

Recomendaría que la cookie no tenga ningún tipo de datos de usuario (un token, como sugirió). Desafortunadamente, esto requerirá otra mesa. Cuando un usuario inicia sesión y elige "mantener inicio de sesión", crea una entrada en esta tabla. La entrada puede ser cualquier valor sin sentido (como md5(uniqid('', true));. Este token puede ser único en la base de datos y correlacionado con la ID de un usuario.

Cuando un usuario visita su sitio web, puede verificar el valor de esa cookie y obtener el usuario pertenece e inicia sesión. En este punto, destruye el token antiguo y crea uno nuevo. "Destruir" puede significar muchas cosas. Puede eliminarlo del DB por completo o tener un indicador que deshabilite el token. quiero permitir que se use el mismo token varias veces en caso de que se reciba la cookie, pero la autenticación no se realiza por algún motivo, pero creo que esto no es seguro. También es posible que desee almacenar la marca de tiempo del token y solo aceptar si ha sido un período de tiempo limitado (30 días por ejemplo).

A s su amigo lo señala, puede almacenar otra información como agente de usuario, dirección IP, etc., pero estos pueden cambiar incluso con el mismo navegador que se está utilizando (especialmente con el móvil) y si no se acepta el inicio de sesión persistente de un usuario debido a esto , podría ser discordante e inconveniente para ellos.

Si realmente no desea crear otra tabla, tendrá que almacenar una forma de adquirir la ID del usuario a partir del valor de la cookie. Esto es menos seguro.

+0

"Cuando un usuario visita su sitio web, puede verificar el valor de esa cookie y obtener el usuario al que pertenece e iniciar sesión" ¿Cuál es la mejor manera de hacerlo? ¿Simplemente redirigirlos a la página segura con su usuario/pase del db? – CodeCrack

+0

@CodeCrack Usted tiene control total sobre si un usuario está autenticado o no, por lo que realmente no existe la mejor manera. Simplemente haga lo mismo que haría después de que ingresaron su nombre de usuario/contraseña. Probablemente tenga (o pueda crear) una función o algo llamado 'complete_login()' que los datos necesarios para la sesión. –

+0

¿Cuál es el beneficio de destruir el antiguo token al iniciar sesión? Supongo que se pasará uno nuevo al cliente en ese momento también, ¿no es así? – Uwe

-3

La forma en que lo he hecho anteriormente es almacenar el hash MD5 de la contraseña, no la contraseña real.

En el lado del servidor es necesario comprobar si la entrada proviene de una galleta y luego comprobar si el hash es la misma que la contraseña de la base de datos después de su estado algoritmo hash mediante MD5

De esta forma si alguien hackea la computadora de los usuarios nunca podrán conocer el valor de la contraseña, sin embargo, aún pueden usar esa cookie para autenticarse solo en su servidor.

Puede hacer que esto sea más seguro haciendo que la cookie caduque después de x días, de modo que si la cookie es robada, theif solo puede obtener acceso para ese período.

Al final del día, el más y único? método seguro es hacer que el usuario inicie sesión cada vez

+0

Las contraseñas ya deben ser hash antes de almacenarse tal como están. –

+0

Tandu es correcto –

+0

Sí, y además pueden usar la tabla Rainbow para bloquear la contraseña. – CodeCrack

4

Para la mayoría de los inicios de sesión automáticos que conozco, existe una tabla separada para almacenar las sesiones registradas. A cada sesión de inicio de sesión automático se le asigna una clave hash como identificador, la clave es considerablemente larga y prácticamente imposible de falsificar. Si no desea que los usuarios inicien sesión en cross-ip, incluso con un código válido, intente esto.

function gen_uniqueIdent($length=32){ 
    $alphabet = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'); 
    $key = ''; 
    for($loop=0;$loop<$length;$loop++){ 
     $i = mt_rand(0,count($alphabet)-1); 
     $key.= $alphabet[$i]; 
    } 
    return $key; 
} 

Asigne este valor a la cookie de usuario al iniciar sesión. A continuación, almacenar esto en el PP:

function save_ident($identFromFunctionAbove,$authenticated_user_id){ 
    //hash this with something unique to the user's machine 
    $hashed = md5($identFromFunctionAbove . $_SERVER['REMOTE_ADDR']); 
    /** Some actions to remember this hash **/ 
} 

salvo que en una base de datos correspinding con una identidad de usuario como user_id.

Ahora tras la validación de la cookie de usuario, puede simplemente:

function validateCookie(){ 
    $ident = $_COOKIE['yourCookieName']; 
    $hashed = md5($ident . $_SERVER['REMOTE_ADDR']); 
    /** Check if this hashed value exists in db, if it does, authenticate user **/ 
} 

Usted también necesitará para eliminar las sesiones después de su vencimiento o el usuario inicia sesión explícitamente.

Por supuesto, esto es muy simple y no tiene en cuenta las colisiones md5 o ident. Aún así, conseguir que dos cadenas generadas al azar de 32 caracteres sean las mismas que las generadas previamente es una posibilidad bastante pequeña.

+0

Una vez que un usuario inicia sesión con la cookie, ¿tengo que configurar manualmente la variable SESSION si la estoy usando para algo o algo mejor, cómo se restaura la "sesión"? – CodeCrack

+0

@CodeCrack En realidad, el método mencionado anteriormente está creando su propio método de gestión de sesión en php. Entonces, básicamente, sí, tienes que establecer manualmente la variable SESSION para usar sesiones PHP con este método. – Jabbany

Cuestiones relacionadas