Verifică parola unui utilizator

30 mar. 2011, 23:11:28
Vizualizări: 32.1K
Voturi: 6

Vreau să verific dacă utilizatorul are o anumită parolă, așa că am încercat cu wp_check_password, dar contul pentru care se face verificarea este deconectat și nu se mai poate autentifica până când nu există un apel al wp_check_password în cod.

Analizând codul, am descoperit că setează parola folosind noul hash, și mai mult, dacă folosesc wp_check_password( 'hello', md5('hello'), 1 );, nici măcar nu verifică ce este în baza de date și returnează true. Nu este asta un bug?

Aveți idei cum pot verifica parola utilizatorului?

0
Toate răspunsurile la întrebare 3
10
14

Exemplul tău funcționează corect. Verifici dacă parola hello se potrivește cu versiunea hashuită a lui hello - ceea ce firește că se întâmplă.

Nu m-am gândit suficient. Exemplul tău cauzează următoarea problemă:

  1. Verifici dacă hello se potrivește cu md5-ul lui hello (în loc de hash-ul din profilul utilizatorului).
  2. Se potrivește și atunci WP consideră că aceasta este corectă, dar o versiune veche de md5 - care trebuie actualizată.
  3. Re-hashuiește hello și actualizează utilizatorul cu el, blocându-i accesul (deoarece parola lui devine acum hello în loc de orice era înainte).

Vezi funcția wp_authenticate_username_password() pentru un exemplu amplu, dar ideea de bază este:

$userdata = get_user_by('login', $username);
$result = wp_check_password($password, $userdata->user_pass, $userdata->ID);
30 mar. 2011 23:23:59
Comentarii

Dar nu se potrivește în toate circumstanțele, ceea ce am presupus că era problema. În primul rând, funcția de hash pentru parolă este modulară, deci nu folosește neapărat md5 (de fapt, nu cred că o face în mod implicit - implicit este phpass).

goldenapples goldenapples
30 mar. 2011 23:45:09

@goldenapples nu are sens să suprascrii wp_hash_password() și să lași wp_check_password(). Neconcordanța hash-ului pur și simplu nu va permite nimănui să treacă verificarea, nu-i așa? :)

Rarst Rarst
30 mar. 2011 23:49:49

Oh, ai dreptate. wp_check_password() va funcționa așa cum ai folosit-o în răspunsul tău. Mă refeream la întrebarea sa originală, verificând 'hello' împotriva md5 din 'hello', care va eșua decât dacă md5 este algoritmul folosit efectiv în wp_hash_password...

goldenapples goldenapples
30 mar. 2011 23:55:00

@goldenapples funcția nativă wp_hash_password() suportă md5 pentru compatibilitate inversă, ea re-hashuiește astfel de parole la verificare. Acum că mă gândesc, aceasta este probabil problema din întrebarea originală...

Rarst Rarst
31 mar. 2011 00:03:01

Da, dacă cele două parole furnizate se potrivesc folosind md5, wp_check_password va reseta parola utilizatorului folosind funcția actuală de hash. Deci în întrebarea originală, deoarece cele două parole furnizate se potriveau, schimba parola utilizatorului în "hello"...

goldenapples goldenapples
31 mar. 2011 00:05:28

@Rarst Mulțumesc! Aceasta funcționează. Și mă întrebam de ce trebuie să furnizez eu hash-ul. Este acolo pentru a menține compatibilitatea inversă, nu? Altfel doar parola de verificat și ID-ul ar fi fost suficiente.

Ashfame Ashfame
31 mar. 2011 00:08:07

@Ashfame funcțiile legate de parole sunt intenționat modularizate și foarte flexibile, astfel încât oamenii să poată construi sau integra scheme alternative de autentificare fără prea multe probleme.

Rarst Rarst
31 mar. 2011 00:11:24

@Rarst Vrei să spui că este pentru a face sistemul modular și nu pentru a menține compatibilitatea retroactivă cu diferite tipuri de hash-uri?

Ashfame Ashfame
31 mar. 2011 00:13:05

@Ashfame este compatibil retroactiv doar cu md5, deoarece acesta este ceea ce WordPress a folosit în trecut.

Rarst Rarst
31 mar. 2011 00:14:45

@Rarst Da! Asta am vrut să spun. M-am gândit că mențiunea ta despre faptul că este extensibilă avea legătură și cu motivul acceptării hash-ului însuși ca argument.

Ashfame Ashfame
31 mar. 2011 00:41:45
Arată celelalte 5 comentarii
2

Puteți obține parola hash-uită din baza de date și să o comparați cu intrarea pe care doriți să o verificați folosind wp_hash_password().

Pentru a verifica dacă parola utilizatorului curent se potrivește cu "hello", încercați acest lucru:

if ( $current_user->user_pass == wp_hash_password( 'hello' ) )
30 mar. 2011 23:18:51
Comentarii

if ( wp_hash_password( $xx_new_password ) != $xx_userinfo->user_pass ) funcționează diferit față de if ( !wp_check_password( $xx_new_password, $xx_userinfo->user_pass , $xx_id ) ) Ciudat! Mulțumesc pentru ajutor!

Ashfame Ashfame
31 mar. 2011 00:10:57

Aceasta este incorect. wp_hash_password() aplică (în 2020) un salt aleatoriu parolei înainte de a o hash-ui, astfel încât nici două apeluri către aceasta nu returnează aceeași valoare.

O. Jones O. Jones
23 oct. 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 'Parola se potrivește.';
}

Credit: https://stackoverflow.com/a/37181662

28 mai 2022 02:34:45