in

php: ¿Cuál es una forma relativamente segura de utilizar una cookie de inicio de sesión?

apple touch icon@2

¡Creo que encontré una solución inteligente!

Ventajas de este script (¿complicado?):

  • Cuando el usuario inicia sesión con éxito con la opción Recordarme marcada, se emite una cookie de inicio de sesión además de la cookie de administración de sesión estándar.[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 la ficha son números aleatorios imposibles de adivinar de un espacio suficientemente 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 el triplete 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 al usuario una nueva cookie de inicio de sesión que contiene los tres.
  • Si el nombre de usuario y la serie están presentes pero el token no coincide, se asume un robo. El usuario recibe una advertencia redactada enérgicamente y se eliminan todas las sesiones recordadas del usuario.
  • Si el nombre de usuario y la serie no están presentes, se ignora la cookie de inicio de sesión.

Hice una tabla en la base de datos con la siguiente información:

    session | token | username | expire

La cookie recordarme tendrá esta configuración:

    $value = "$session|$token|$userhash"; //Total length = 106
  • Session será una cadena de 40 (sha1) caracteres.
  • Token será una cadena de 32 (md5) caracteres.
  • Userhash en la cookie habrá una cadena de 32 (md5 de nombre de usuario) caracteres.
  • Username en la base de datos será el nombre de usuario normal.
  • Expire será ahora + 60 días.

La secuencia de comandos:

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, "http://stackoverflow.com/", '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 del guión:

  • Inicio de sesión múltiple. Puede crear nuevas sesiones para cada computadora en la que esté.
  • La cookie y la base de datos se mantendrán limpias. Los usuarios activos renuevan la cookie en cada inicio de sesión.
  • La verificación de la sesión al principio asegura que la base de datos no recibirá solicitudes inútiles.
  • Si un atacante roba una cookie, obtiene un nuevo token, pero no una nueva sesión. Entonces, cuando el usuario real visita el sitio web con el token antiguo (no válido) pero CON una combinación de sesión de usuario válida, 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 mantiene el atacante no es válida. La revalidación garantiza que la víctima sea realmente la víctima y no el atacante.

Referencia: http://jaspan.com/improved_persistent_login_cookie_best_practice

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

pulse width

Circuitos de pulsos: puertas de muestreo

07ESnYKtyN4yL4JWRbG6RUY 2.1634671519.fit lim.size 1200x630

Revisión de QNAP TS-451D2 | PCMag