web-dev-qa-db-fra.com

Génération d'un code de confirmation pour une confirmation par e-mail

En utilisant PHP, quelles sont les façons de générer un code de confirmation aléatoire qui peut être stocké dans une base de données et utilisé pour la confirmation par e-mail? Je ne peux pas pour la vie de penser à un moyen de générer un numéro unique qui peut être généré à partir du profil d'un utilisateur. De cette façon, je peux utiliser une fonction pour rendre le nombre suffisamment petit pour être inclus dans l'URL ( voir ce lien ). N'oubliez pas que l'utilisateur doit cliquer sur le lien pour "confirmer/activer" son compte. Si je ne peux pas utiliser de chiffres, je n'ai aucun problème à utiliser des lettres et des chiffres.

Cela dit, j'ai essayé de hacher le nom d'utilisateur avec un "sel" pour générer le code aléatoire. Je sais qu'il doit y avoir un meilleur moyen, alors écoutons-le.

34
luckytaxi
$random_hash = md5(uniqid(Rand(), true));

Ce sera 32 caractères alphanumériques longs et uniques. Si vous voulez qu'il soit plus court, utilisez simplement substr ():

$random_hash = substr(md5(uniqid(Rand(), true)), 16, 16); // 16 characters long

Les méthodes alternatives pour générer des données aléatoires incluent:

$random_hash = md5(openssl_random_pseudo_bytes(32));
$random_hash = md5(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

// New in PHP7
$random_hash = bin2hex(random_bytes(32));
55
John Conde

1) Créer un champ activé dans la base de données

2) Après l'enregistrement, l'e-mail est envoyé

3) Créer un lien à inclure dans le courrier électronique, utiliser un identifiant unique Il ressemblerait à ceci

Bienvenue Nom d'utilisateur Merci de votre inscription.

Veuillez cliquer sur le lien ci-dessous pour activer votre compte

domain.com/register.php?uid=100&activate=1

4) Mettre à jour le champ activé sur true

alt text
(source: jackborn.com )

$email_encrypt = urlencode($email);
$special_string = 'maybeyourcompanynamereversed?';
$hash = md5($email_encrypt.$special_string);

Here is the link that is sent to the email that was provided:

http://yourdoman.com/confirm.php?hash='.$hash.'

The actual link will look something like this:

http://yourdomain.com/confirm.php?hash=00413297cc003c03d0f1ffe1cc8445f8
10
streetparade

La réponse acceptée suggère d'utiliser un hachage de la uniqid() de PHP. Le documentation pour uniqid avertit explicitement qu'il ne crée pas de "chaînes aléatoires ni imprévisibles", et déclare catégoriquement que " Cette fonction ne doit pas être utilisée à des fins de sécurité."

En cas de doute sur la possibilité de deviner un code de confirmation (et c'est tout l'intérêt d'émettre un code), vous pouvez utiliser un générateur plus aléatoire tel que openssl_random_pseudo_bytes(). Vous pouvez ensuite utiliser bin2hex() pour le transformer en un alphanumérique de Nice. Ce qui suit ressemble à la sortie de la réponse de John Conde, mais est (soi-disant) plus aléatoire et moins devinable:

// generate a 16 byte random hex string
$random_hash = bin2hex(openssl_random_pseudo_bytes(16))

Addendum tardif: Comme le souligne Oleg Abrazhaev, si vous voulez vous assurer que votre système est réellement capable de générer des valeurs aléatoires cryptographiquement fortes lors de l'exécution, openssl_random_pseudo_bytes accepte une référence à un booléen pour le signaler. Code de phpinspectionsea docs :

$random = openssl_random_pseudo_bytes(32, $isSourceStrong);
if (false === $isSourceStrong || false === $random) {
    throw new \RuntimeException('IV generation failed');
}

Utilisez ensuite la valeur aléatoire générée comme précédemment:

$random_hash = bin2hex($random)
4
Robert

J'ai décidé que j'avais besoin de quelque chose d'un peu plus robuste et de fonctionnalités supplémentaires. Voilà donc ce que j'ai trouvé.

/**
 * Hash Gen 
 * @author Kyle Coots
 * @version    1.0
 * Allow you to create a unique hash with a maximum value of 32.
 * Hash Gen uses phps substr, md5, uniqid, and Rand to generate a unique 
 * id or hash and allow you to have some added functionality.
 * 
 * @see subtr()
 * @see md5()
 * @see uniqid()
 * @see Rand()
 *  
 * You can also supply a hash to be prefixed or appened
 * to the hash. hash[optional] is by default appened to the hash 
 * unless the param prefix[optional] is set to prefix[true].     
 * 
 * @param start[optional]
 * @param end[optional]
 * @param hash[optional]
 * @param prefix bool[optional]
 * 
 * @return string a unique string max[32] character
 */
function hash_gen($start = null, $end = 0, $hash = FALSE, $prefix = FALSE){

    // start IS set NO hash
    if( isset($start, $end) && ($hash == FALSE) ){

        $md_hash = substr(md5(uniqid(Rand(), true)), $start, $end);
        $new_hash = $md_hash;

    }else //start IS set WITH hash NOT prefixing
    if( isset($start, $end) && ($hash != FALSE) && ($prefix == FALSE) ){

        $md_hash = substr(md5(uniqid(Rand(), true)), $start, $end);
        $new_hash = $md_hash.$hash;

    }else //start NOT set WITH hash NOT prefixing 
    if( !isset($start, $end) && ($hash != FALSE) && ($prefix == FALSE) ){

        $md_hash = md5(uniqid(Rand(), true));
        $new_hash = $md_hash.$hash;

    }else //start IS set WITH hash IS prefixing 
    if( isset($start, $end) && ($hash != FALSE) && ($prefix == TRUE) ){

        $md_hash = substr(md5(uniqid(Rand(), true)), $start, $end);
        $new_hash = $hash.$md_hash;

    }else //start NOT set WITH hash IS prefixing
    if( !isset($start, $end) && ($hash != FALSE) && ($prefix == TRUE) ){

        $md_hash = md5(uniqid(Rand(), true));
        $new_hash = $hash.$md_hash;

    }else{

        $new_hash = md5(uniqid(Rand(), true));

    }

    return $new_hash;

 } 
3
Kyle Coots