MVC Framework Symfony utiliza el siguiente método para crear una cookie recordarme:
/**
* Generates a hash for the cookie to ensure it is not being tempered with.
*
* @param string $class
* @param string $username The username
* @param int $expires The Unix timestamp when the cookie expires
* @param string $password The encoded password
*
* @return string
*/
protected function generateCookieHash($class, $username, $expires, $password)
{
return hash_hmac('sha256', $class.$username.$expires.$password, $this->getKey());
}
Entonces, usan una cadena de la clase de usuario, seguida del nombre de usuario, luego una marca de tiempo y luego la contraseña del usuario. Se sala con una clave que nunca cambia y es igual para todos los usuarios en todo el sistema.
Ahora aquí está mi problema con esto: ¿Por qué poner la contraseña en la cookie? Aunque es la contraseña con hash y salada (con otra sal, única para cada usuario), ¿no es un riesgo innecesario?
¿O estoy siendo paranoico aquí?
Además, con ese hash, parece que lo único único es la marca de tiempo de caducidad. Parece que sería posible copiar algunas cookies antiguas y crear una nueva para un ataque de repetición, ¿no?
Actualizar
La cookie resultante está codificada en base64 y su contenido decodificado es:
Somenamespace\YourApp\YourUserClass:MjQ2NjM=:1501576079:74fbfcddcc66c2a11586bf4e39e68ddb459afa3a3fa6684e93d03fc393ee1141
El primer elemento es la clase de usuario. El Segundo Parámetro debería ser el nombre de usuario codificado en base64, pero esto es lo que obtengo, así que supongo que es el ID de usuario. Intentaré descubrir cómo funciona eso también. El tercer parámetro es la marca de tiempo "caduca", por lo que ni siquiera tiene que adivinar eso. El cuarto parámetro es dicho hash de cookie.