Generowanie kodu potwierdzającego potwierdzenie wiadomości e-mail

Używając PHP, jakie są sposoby na wygenerowanie losowego kodu potwierdzającego, który może być przechowywany w DB i używany do potwierdzenia wiadomości e-mail? Nie mogę na całe życie wymyślić sposobu na wygenerowanie unikalnego numeru, który można wygenerować z profilu użytkownika. W ten sposób mogę użyć funkcji, aby liczba była wystarczająco mała, aby mogła być zawarta w adresie URL ( zobacz ten link ). Pamiętaj, że użytkownik musi kliknąć na link "potwierdź / aktywuj" swoje konto. Jeśli nie mogę używać liczb, nie mam żadnych problemów używając zarówno liter, jak i cyfr.

Mając to powiedziane, próbowałem hashować nazwę użytkownika wraz z "salt", aby wygenerować losowy Kod. Wiem, że musi być lepszy sposób, więc posłuchajmy.

Author: John Conde, 2010-01-18

5 answers

$random_hash = md5(uniqid(rand(), true));

Będzie to 32 znaki alfanumeryczne długie i unikalne. Jeśli chcesz, aby była krótsza, użyj substr ():

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

Alternatywne metody generowania losowych danych to:

$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));
 49
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-05 12:23:58

1) Utwórz aktywowane pole w Bazie Danych

2) Po rejestracji e-mail jest wysyłany

3) Utwórz Link do umieszczenia w e-mailu, użyj unikalnego identyfikatora Wyglądałoby to mniej więcej tak

Witamy Nazwa użytkownika Dziękujemy za rejestrację.

Kliknij poniższy Link, aby aktywować swoje konto

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

4) zaktualizuj aktywowane pole do true

Alt text http://www.jackborn.com/wpress/wp-content/uploads/2008/02/confirmsubs2.gif

$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
 9
Author: streetparade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 20:45:37

Zdecydowałem, że potrzebuję czegoś bardziej solidnego i dodanego funkcjonalności. Więc to właśnie wymyśliłem.

/**
 * 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
Author: toystory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-04 02:15:28

Zaakceptowana odpowiedź sugeruje użycie hasha PHP uniqid(). Dokumentacja dla uniqid wyraźnie ostrzega, że nie tworzy "losowych ani nieprzewidywalnych łańcuchów" i stwierdza dobitnie, że "Ta funkcja nie może być używana do celów bezpieczeństwa."

Jeśli istnieje jakakolwiek obawa o możliwość odgadnięcia kodu potwierdzającego (i to jest cały sens wydawania kodu), możesz użyć bardziej losowego generatora, takiego jak openssl_random_pseudo_bytes(). Możesz wtedy użyć bin2hex() aby zmienić go w ładny alfanumeryczny. Poniżej wygląda podobnie do odpowiedzi Johna Conde ' a, ale jest (podobno) bardziej losowy i mniej zgadywalny:

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

Późny dodatek: jak podkreśla Oleg Abrazhaev, jeśli chcesz mieć pewność, że Twój system jest w stanie generować silne kryptograficznie wartości losowe w czasie wykonywania, openssl_random_pseudo_bytes akceptuje odniesienie do bool, aby to zgłosić. Kod z phpinspectionsea docs :

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

Następnie użyj wygenerowana losowa wartość jak poprzednio:

$random_hash = bin2hex($random)
 3
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-26 20:33:20
  private  function generateCodeSecurity()
  {
    list($usec, $sec) = explode(" ", microtime());
    $micro = usec + $sec;

    $hoy = date("Y-m-d");  
    $str = str_replace('-','',$hoy); 

    return  rand($str,  $micro);

  }

Za pomocą tego małego kodu możesz wygenerować losową liczbę z zakresu od 7 do 11 liczb.

Używanie funkcji php:

Rand ();
Microtime ()



$hoy = date("Y-m-d");  
$str = str_replace('-','',$hoy); 

echo $str; 
result date: 20170217



 list($usec, $sec) = explode(" ", microtime());
 $micro = usec + $sec;


echo $micro;
result  micro varaible: 1487340849

Przekazywanie parametrów w tej funkcji: rand ();

 rand($str,  $micro);

And return;

Przykład:

 list($usec, $sec) = explode(" ", microtime());
    $micro = usec + $sec;

    $hoy = date("Y-m-d");  
    $str = str_replace('-','',$hoy); 

   $finalresult = rand($str,  $micro);

echo $finalresult; 

Wynik: 1297793555

myślę, że trudno jest powtórzyć tę liczbę, z tego powodu nigdy nie będzie to ten sam dzień, ani ta sama godzina, ani te same milisekundy czas.

 -1
Author: SPC ANGEL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 14:21:30