Folosirea user_activation_key pentru alte scopuri

28 oct. 2012, 10:11:16
Vizualizări: 32.2K
Voturi: 6

Trebuie să știu dacă este sigur să folosesc user_activation_key (din WP_User) pentru alt scop, cum ar fi verificarea emailului (o funcționalitate pe care aș crea-o și care ar trimite mai întâi o verificare prin email înainte de activarea contului creat)?

Iată cum vor funcționa lucrurile. Un utilizator se va înregistra folosind formularul meu personalizat de înregistrare care va fi disponibil doar în frontend. După înregistrarea cu succes, utilizatorul va fi notificat prin email că contul a fost creat împreună cu link-ul de activare care este generat la înregistrare folosind următoarea convenție:

http://www.example.com/verify/?key=SAMPLEACTIVATIONKEY4321

Credeți că această abordare va fi sigură?

0
Toate răspunsurile la întrebare 2
2

Crezi că acest lucru va fi sigur?

Poate. Două probleme.

De asemenea, trebuie să te asiguri că cheia nu poate fi ghicită. Fără numere incrementale. Poți folosi ceva de genul wp_generate_password pentru a obține niște caractere pseudo-aleatorii. Folosește un "salt" aleatoriu plus email-ul utilizatorului și timpul de înregistrare sau uniqid și ai șanse mari să asiguri unicitatea (vezi mai jos) și să creezi o cheie care nu poate fi ghicită.

$user_email = some_function_to_get_user_email();
$salt = wp_generate_password(20); // șir "aleatoriu" de 20 de caractere
$key = sha1($salt . $user_email . uniqid(time(), true));

De asemenea, trebuie să te asiguri că cheia este unică: nu ar trebui să existe coliziuni.

Nu există constrângeri pe coloana user_activation_key în baza de date care să asigure unicitatea, așa că este responsabilitatea aplicației tale (de ex. WordPress și partea de PHP) să se asigure de acest lucru. Cu alte cuvinte, fie înainte, fie după ce generezi cheia, asigură-te că nu există deja în baza de date. Exemplu simplu, netestat:

<?php
$key = some_function_that_generates_a_key();
$res = $wpdb->get_col($wpdb->prepare("SELECT EXISTS(SELECT 1 FROM {$wpdb->users} WHERE user_activation_key = %s)", $key));
if ($res) {
    // cheia există, încearcă din nou!
} else {
    // totul este în regulă.
}

Dacă ai nevoie de un ghid, încearcă să te uiți la cum WordPress gestionează email-urile de resetare a parolei. Procesul este același: generează o cheie care nu poate fi ghicită, asigură-te că este unică, inserează-o în baza de date împreună cu utilizatorul corespunzător, apoi trimite-le un email cu un link pentru resetarea parolei.

27 ian. 2013 06:57:57
Comentarii

Mulțumesc pentru acel răspuns minunat. (Știu că răspunsul a întârziat haha! Dar acesta este cu adevărat util.)

mcometa mcometa
18 sept. 2013 12:14:58

Sau dacă nu vrei să te deranjezi cu coliziunea, pur și simplu treci și ID-ul utilizatorului în cererea de verificare

Tofandel Tofandel
24 feb. 2019 18:03:51
3

Nu este sigur, pentru că oricine poate folosi acest lucru. Dar dacă poți să-ți dai adresa de email, atunci se poate trimite o cheie de activare specifică sau un număr, ceea ce ar fi sigur.

28 oct. 2012 10:33:36
Comentarii

Salut @Ajay, am editat întrebarea mea pentru mai multe detalii complete. Te rog verifică din nou, deoarece nu am înțeles ce ai vrut să spui prin "oricine poate folosi asta".

mcometa mcometa
28 oct. 2012 11:05:39

Cred că el se referă la faptul că trebuie să fie mai specific pentru utilizatorul căruia îi aparține cheia de activare. Acest lucru va împiedica persoanele să folosească metode de forță brută pentru a accesa contul altcuiva.

Ollie Ollie
28 oct. 2012 14:20:24

@Ollie Am asigurat că cheia de activare este trimisă la adresa de email a utilizatorului care încearcă să se înregistreze. De asemenea, cheia de activare conține o valoare hashed a numelui de utilizator, parolei și a timestamp-ului. Fac lucrurile corect? Sunt cam nou în aceste lucruri cu Wordpress.

mcometa mcometa
28 oct. 2012 15:33:29