Utilizzare user_activation_key per altri scopi in WordPress

28 ott 2012, 10:11:16
Visualizzazioni: 32.2K
Voti: 6

Ho bisogno di sapere se è sicuro utilizzare user_activation_key (da WP_User) per altri scopi come la verifica email (una funzionalità che vorrei creare per inviare una verifica email prima di attivare l'account creato)?

Ecco come funzionerà il processo. Un utente si registrerà utilizzando il mio modulo di registrazione personalizzato che sarà disponibile solo nel front-end. Dopo la registrazione avvenuta con successo, l'utente riceverà una notifica via email che l'account è stato creato insieme al link di attivazione generato durante la registrazione utilizzando la seguente convenzione:

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

Pensate che questo metodo sia sicuro?

0
Tutte le risposte alla domanda 2
2

Pensi che questo sarà sicuro?

Forse. Ci sono due problemi.

Devi anche assicurarti che la chiave non sia indovinabile. Niente numeri incrementali. Puoi usare qualcosa come wp_generate_password per ottenere caratteri pseudo casuali. Usa un "salt" casuale più l'email dell'utente e l'ora di registrazione oppure uniqid e avrai buone probabilità di garantire l'unicità (vedi sotto) e creare una chiave non indovinabile.

$user_email = some_function_to_get_user_email();
$salt = wp_generate_password(20); // stringa "random" di 20 caratteri
$key = sha1($salt . $user_email . uniqid(time(), true));

Dovrai anche assicurarti che la chiave sia unica: non dovrebbero esserci collisioni.

Non ci sono vincoli nella colonna user_activation_key del database che garantiscono l'unicità, quindi spetta alla tua applicazione (es. WordPress e la parte PHP) assicurarsene. In altre parole, prima o dopo aver generato la chiave, assicurati che non esista già nel database. Esempio semplice non testato:

<?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) {
    // la chiave esiste, riprova!
} else {
    // tutto ok.
}

Se hai bisogno di una guida, prova a vedere come WordPress gestisce le email di reset della password. Il processo è lo stesso: genera una chiave non indovinabile, assicurati che sia unica, inseriscila nel database con l'utente corrispondente, poi invia loro un'email con un link per reimpostare la password.

27 gen 2013 06:57:57
Commenti

Grazie per questa risposta meravigliosa. (So che la risposta è arrivata in ritardo haha! Ma questa è davvero utile.)

mcometa mcometa
18 set 2013 12:14:58

Oppure, se non vuoi preoccuparti delle collisioni, passa semplicemente anche l'ID utente nella richiesta di verifica

Tofandel Tofandel
24 feb 2019 18:03:51
3

No, non è sicuro perché chiunque può usarlo. Ma se puoi fornire il tuo indirizzo email, allora è possibile riferirti a una chiave o numero di attivazione specifico e quindi diventa sicuro.

28 ott 2012 10:33:36
Commenti

Ciao @Ajay, ho modificato la mia domanda per includere maggiori dettagli. Per favore controlla di nuovo perché non ho capito cosa intendessi con "qualcuno usa questo".

mcometa mcometa
28 ott 2012 11:05:39

Penso che intenda che deve essere reso più specifico per l'utente a cui appartiene la chiave di attivazione. Questo impedirà a individui di utilizzare metodi di forza bruta per accedere all'account di qualcun altro.

Ollie Ollie
28 ott 2012 14:20:24

@Ollie Mi sono assicurato che la chiave di attivazione venga inviata all'indirizzo email dell'utente che sta tentando di registrarsi. Inoltre la chiave di attivazione contiene un valore hash del nome utente, password e timestamp. Sto facendo la cosa giusta? Sono piuttosto nuovo a queste cose con Wordpress.

mcometa mcometa
28 ott 2012 15:33:29