La possibilità che descrivi esiste; come altri hanno notato, è un "uomo in mezzo all'attacco".
Per ostacolarlo, è necessario un ulteriore segreto che è non inviato via e-mail, ad esempio (un brutto segreto come è) una chiave cookie. Puoi chiedere all'utente di reimpostare la password utilizzando lo stesso computer e browser utilizzato per inviare il comando "Voglio reimpostare la mia password".
Quindi, l'attaccante non sarà in grado di inviare il cookie appropriato, poiché il suo dominio è diverso da quello originale, il browser non gli avrà detto il valore appropriato del cookie da utilizzare.
Una possibilità più rigida è di richiedere all'utente di inserire nella pagina "Reimpostazione password", senza chiuderla , un codice che viene inviato tramite e-mail. L'email a quel punto non contiene nemmeno un link. L'hacker conosce il codice, ma non ha il controllo sulla finestra del browser aperta. La finestra può contenere un segreto nascosto che il server sta "dicendo" a se stesso, o un cookie (che è fondamentalmente la stessa cosa). Per evitare l'uso di informazioni persistenti, il server potrebbe archiviare nella pagina una stringa casuale e inviare l'hash della stringa casuale con un salt segreto. L'utente compilerà quindi un modulo che ha entrambi i valori (uno nascosto, uno copiato dall'email). Il server esegue il hash del codice con il suo sale segreto. Se le due stringhe sono uguali, la modifica è approvata. Per evitare "attacchi ripetuti" in questo caso (ad esempio, riutilizzo di una coppia di challenge / hash nota), il controllo potrebbe includere il nome utente e un timestamp:
form
username hidden (e.g. "lserni")
timestamp hidden (e.g. 20140108131005)
hash hidden (e.g. "e2961ca083b4393690ec74b93d3c4b32")
code input
L'utente riceve il codice "123456", a caso tra 100.000 e 999999. C'è una possibilità in circa novecentomila di indovinarlo con successo. Il server concatena SERVERSECRETPASSWORD.lserni.20140108131005.123456 e verifica che lo hash su e2961ca083b4393690ec74b93d3c4b32
.
L'attaccante può indovinare il timestamp, ma non ha accesso all'hash. Conoscere un hash e il codice corrispondente funzionerà solo con il nome utente corretto, e solo fino alla differenza tra il timestamp memorizzato, che non può essere modificato, e il wall clock non diventerà troppo grande, a quel punto il server offrirà per inviare un'altra email.
Un possibile problema (inevitabile)
D'altra parte, se l'utente malintenzionato ha il controllo dell'email, può avviare personalmente un recupero della password e ottenere il pieno accesso alla risorsa almeno una volta. Per evitare questo, dovrebbero essere fornite alcune altre informazioni (ad esempio una "domanda segreta") per avviare la reimpostazione della password. Inoltre, un avviso in caso di autenticazione non riuscita dovrebbe essere rilasciato all'utente, in modo che venga messo a conoscenza del problema ("Password errata. Ricorda che hai cambiato la password ieri alle 17:23 da IP 1.2.3.4 Se non l'hai fatto, tieni presente che ... ");
Un altro possibile problema
Su alcuni sistemi, ti sarà permesso di chiedere al server di " ricordarti ". Il server lo farà emettendo un cookie che è, sotto ogni aspetto, una autenticazione debole e potrebbe non essere più connesso alla password.
Una modifica della password dovrebbe invalidare tutti questi cookie , altrimenti l'attaccante può:
- prendere il controllo della posta elettronica
- avviare una reimpostazione della password
- intercetta il codice di reimpostazione della password
- cancella l'email con la reimpostazione della password
- cambia la password
- chiedi al server "Ricordami" e ottieni un cookie "Get Home Free"
- profitto
- l'utente scoprirà di non essere in grado di accedere
- cambierà la password e ricollegherà
- l'utente malintenzionato ancora potrà accedere con il suo cookie.
Un modo per farlo è impostare il cookie su una stringa casuale più l'hash di un server segreto, la stringa casuale, il nome utente e l'hash della password dell'utente nel database. Una modifica della password annullerà automaticamente tutti i cookie di autenticazione esistenti per quell'utente.