Verificare la password di un utente
Voglio verificare se un utente ha una password specifica, quindi ho provato a usare wp_check_password
ma l'account che viene controllato viene disconnesso e non può accedere nuovamente finché c'è una chiamata a wp_check_password
nel codice.
Analizzando il codice, ho scoperto che imposta la password utilizzando il nuovo hash. Inoltre, se uso wp_check_password( 'hello', md5('hello'), 1 );
, non controlla nemmeno cosa c'è nel database e restituisce true. Non è questo un bug?
Avete idee su come posso verificare la password di un utente?

Il tuo esempio funziona correttamente. Stai verificando se la password hello
corrisponde all'hash di hello
- cosa che naturalmente avviene.
Non ci avevo pensato a fondo. Il tuo esempio causa il seguente problema:
- Verifichi se
hello
corrisponde all'md5 dihello
(invece dell'hash del profilo utente). - Corrisponde e quindi WP pensa che sia corretta, ma un hash md5 obsoleto - che deve essere aggiornato.
- Ricalcola l'hash di
hello
e aggiorna l'utente con esso, bloccandolo (poiché ora la sua password èhello
invece di qualunque cosa fosse prima).
Vedi la funzione wp_authenticate_username_password()
per un esempio completo, ma l'idea di base è:
$userdata = get_user_by('login', $username);
$result = wp_check_password($password, $userdata->user_pass, $userdata->ID);

Ma non corrisponde in tutte le circostanze, che è quello che pensavo fosse il problema. Per prima cosa, la funzione di hash della password è sostituibile, quindi non necessariamente utilizza md5 (in realtà, non credo che sia predefinita - il default è phpass).

@goldenapples non ha senso sovrascrivere wp_hash_password()
e lasciare wp_check_password()
. Una mancata corrispondenza dell'hash semplicemente non permetterà a nessuno di superare il controllo, no? :)

Oh, hai ragione. wp_check_password()
funzionerà nel modo in cui lo stavi usando nella tua risposta. Mi riferivo alla sua domanda originale, verificando 'hello' contro l'md5 di 'hello', che fallirà a meno che md5 non sia l'algoritmo effettivamente utilizzato in wp_hash_password
...

@goldenapples la funzione nativa wp_hash_password()
supporta md5 per compatibilità all'indietro, e ri-hasha tali password durante il controllo. Ora che ci penso, questo è probabilmente il problema nella domanda originale...

Sì, se le due password fornite corrispondono usando md5, wp_check_password reimposta la password dell'utente utilizzando la funzione di hashing corrente. Quindi nella domanda originale, poiché le due password fornite corrispondevano, stava cambiando la password dell'utente in "hello"...

@Rarst Grazie! Funziona. E mi stavo chiedendo perché devo fornire l'hash da solo. È lì per mantenere la compatibilità all'indietro, giusto? Altrimenti sarebbero bastati solo la password da verificare e l'ID.

@Ashfame le funzioni relative alle password sono volutamente inseribili e molto flessibili, in modo che le persone possano creare o integrare schemi di autenticazione alternativi senza troppi problemi.

@Rarst Vuoi dire che è per renderlo inseribile e non per mantenere la compatibilità con gli hash diversi?

@Ashfame è compatibile solo all'indietro con md5, perché è quello che WP utilizzava in passato.

Puoi ottenere la password crittografata dal database e confrontarla con quella che vuoi verificare utilizzando wp_hash_password().
Per verificare se la password dell'utente corrente corrisponde a "hello", prova questo:
if ( $current_user->user_pass == wp_hash_password( 'hello' ) )

if ( wp_hash_password( $xx_new_password ) != $xx_userinfo->user_pass )
funziona diversamente da if ( !wp_check_password( $xx_new_password, $xx_userinfo->user_pass , $xx_id ) )
Strano! Grazie per l'aiuto!

require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash(8, TRUE);
$password_hashed = '$P$BB3pP6fQAYa61ael0LNQlpB1NOyqNY0';
$plain_password = 'admin2';
if($wp_hasher->CheckPassword($plain_password, $password_hashed)) {
print 'Password corrisponde.'; // Traduzione di "Password matched."
}
Crediti a: https://stackoverflow.com/a/37181662
