web-dev-qa-db-fra.com

Utilisez la clé utilisateur_activation à d'autres fins

J'ai besoin de savoir s'il est prudent d'utiliser user_activation_key (à partir de WP_User) à d'autres fins, telles que la vérification des e-mails (fonctionnalité que je créerais et qui enverrait une vérification par e-mail avant d'activer le compte créé)?

Alors, voici comment les choses vont fonctionner. Un utilisateur s’inscrira en utilisant mon formulaire d’inscription personnalisé, qui ne sera disponible que sur le système frontal. Une fois l'inscription réussie, l'utilisateur sera informé par courrier électronique que le compte a été créé avec le lien d'activation créé lors de l'inscription, selon la convention suivante:

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

Pensez-vous que cela sera en sécurité?

5
mcometa

Pensez-vous que cela sera en sécurité?

Peut être. Deux problèmes.

Vous devez également vous assurer que la clé n'est pas concevable. Aucun nombre incrémentant. Vous pouvez utiliser quelque chose comme wp_generate_password pour obtenir des caractères aléatoires psuedo. Utilisez un "sel" aléatoire plus le courrier électronique et le temps d'inscription de l'utilisateur ou uniqid et vous avez de très bonnes chances de garantir l'unicité (voir ci-dessous) et de créer une clé non-concevable.

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

Vous devrez également vous assurer que la clé est unique: il ne devrait y avoir aucune collision.

Il n'y a aucune contrainte sur la colonne user_activation_key de la base de données qui assure l'unicité, il appartient donc à votre application (par exemple, WordPress et le côté PHP) de s'en assurer. En d'autres termes, avant ou après la génération de la clé, assurez-vous qu'elle n'existe pas déjà dans la base de données. Exemple simple et non testé:

<?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) {
    // the key exists, try again!
} else {
    // good to go.
}

Si vous avez besoin d’un guide, essayez de regarder comment WordPress réinitialise le courrier électronique des mots de passe. Le processus est le même: générer une clé non-concevable, assurez-vous qu’elle est unique, insérez-la dans la base de données avec l’utilisateur correspondant, puis envoyez-leur un courrier électronique contenant un lien pour réinitialiser le mot de passe.

6
chrisguitarguy

Non, ce n’est pas sûr, car tout le monde l’utilise. mais si vous pouvez donner votre identifiant email, il vous dirigera vers une clé ou un numéro d’activation spécifique, il sera alors sécurisé.

1