Il framework MVC Symfony utilizza il seguente metodo nella sua creazione di un cookie remember me:
/**
* 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());
}
Quindi usano una stringa della classe utente, seguita dal nome utente, quindi un timestamp e poi la password dell'utente. Viene salato con una chiave che non cambia mai ed è uguale per tutti gli utenti del sistema.
Ora ecco il mio problema con questo: Perché inserire la password nel cookie? Anche se è la password salata e salata (con un altro sale, unico per ogni utente), non è un rischio inutile?
O sono paranoico qui?
Inoltre, con quell'hash, sembra che l'unica cosa unica sia la data e ora della scadenza. Sembra che sarebbe possibile copiare alcuni vecchi cookie e crearne uno nuovo per un attacco di riproduzione giusto?
Aggiorna
Il cookie risultante è codificato in base64 e il suo contenuto decodificato è:
Somenamespace\YourApp\YourUserClass:MjQ2NjM=:1501576079:74fbfcddcc66c2a11586bf4e39e68ddb459afa3a3fa6684e93d03fc393ee1141
Il primo elemento è la classe utente. Il secondo parametro dovrebbe essere il nome utente codificato in base 64 ma questo è ciò che ottengo per questo, quindi suppongo che sia l'id utente. Proverò a scoprire come funziona anche questo. Il terzo parametro è il timestamp "scade", quindi non devi nemmeno indovinare. Il quarto parametro è detto cookie hash.