Verificare la password di un utente

30 mar 2011, 23:11:28
Visualizzazioni: 32.1K
Voti: 6

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?

0
Tutte le risposte alla domanda 3
10
14

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:

  1. Verifichi se hello corrisponde all'md5 di hello (invece dell'hash del profilo utente).
  2. Corrisponde e quindi WP pensa che sia corretta, ma un hash md5 obsoleto - che deve essere aggiornato.
  3. 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);
30 mar 2011 23:23:59
Commenti

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 goldenapples
30 mar 2011 23:45:09

@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? :)

Rarst Rarst
30 mar 2011 23:49:49

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 goldenapples
30 mar 2011 23:55:00

@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...

Rarst Rarst
31 mar 2011 00:03:01

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"...

goldenapples goldenapples
31 mar 2011 00:05:28

@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 Ashfame
31 mar 2011 00:08:07

@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 Rarst
31 mar 2011 00:11:24

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

Ashfame Ashfame
31 mar 2011 00:13:05

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

Rarst Rarst
31 mar 2011 00:14:45

@Rarst Sì! È proprio quello che intendevo. Pensavo che il tuo riferimento alla sua natura "pluggable" avesse a che fare anche con il motivo per cui accetta l'hash stesso come argomento.

Ashfame Ashfame
31 mar 2011 00:41:45
Mostra i restanti 5 commenti
2

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' ) )
30 mar 2011 23:18:51
Commenti

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!

Ashfame Ashfame
31 mar 2011 00:10:57

Questo non è corretto. wp_hash_password() applica (nel 2020) un salt casuale alla password prima di eseguirne l'hash, quindi nessuna delle due chiamate restituisce lo stesso valore.

O. Jones O. Jones
23 ott 2020 00:07:52
0
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

28 mag 2022 02:34:45