Генерация кода подтверждения для подтверждения по электронной почте - PullRequest
34 голосов
/ 18 января 2010

С помощью PHP, как можно сгенерировать случайный код подтверждения, который можно сохранить в БД и использовать для подтверждения по электронной почте? Я не могу придумать, как создать уникальный номер, который можно сгенерировать из профиля пользователя. Таким образом, я могу использовать функцию, чтобы сделать число достаточно маленьким для включения в URL ( см. Эту ссылку ). Помните, что пользователь должен нажать на ссылку, чтобы «подтвердить / активировать» свою учетную запись. Если я не могу использовать цифры, у меня нет проблем с использованием букв и цифр.

С учетом вышесказанного я попытался хешировать имя пользователя и "соль" для генерации случайного кода. Я знаю, что должен быть лучший путь, поэтому давайте послушаем его.

Ответы [ 5 ]

51 голосов
/ 18 января 2010
$random_hash = md5(uniqid(rand(), true));

Это будет 32 буквенно-цифровых символа длиной и уникальным. Если вы хотите, чтобы он был короче, просто используйте substr ():

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

Альтернативные методы для генерации случайных данных включают в себя:

$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));
9 голосов
/ 18 января 2010

1) Создание активированного поля в базе данных

2) После регистрации отправляется электронное письмо

3) Создайте ссылку для включения в электронную почту, используйте уникальный идентификатор. Это будет выглядеть примерно такthis

Welcome Имя пользователя Спасибо за регистрацию.

Пожалуйста, нажмите на ссылку ниже, чтобы активировать свою учетную запись

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

4) Обновите Активированное поле на true

alt text
(источник: 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
4 голосов
/ 30 августа 2014

В принятом ответе предлагается использовать хэш PHP uniqid(). Документация для uniqid явно предупреждает, что он не создает «случайных или непредсказуемых строк», и решительно заявляет, что « Эта функция не должна использоваться в целях безопасности. »

Если есть какие-либо опасения относительно возможности угадывания кода подтверждения (и в этом весь смысл выдачи кода), вы можете использовать более случайный генератор, такой как openssl_random_pseudo_bytes(). Затем вы можете использовать bin2hex(), чтобы превратить его в хороший буквенно-цифровой. Следующее выглядит так же, как результат ответа Джона Конде, но является (предположительно) более случайным и менее предположительным:

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

Позднее приложение: Как указывает Олег Абражаев, если вы хотите убедиться, что ваша система действительно способна генерировать криптографически сильные случайные значения во время выполнения, openssl_random_pseudo_bytes принимает ссылку на bool, чтобы сообщить об этом , Код из phpinspectionsea docs :

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

Затем используйте сгенерированное случайное значение, как и раньше:

$random_hash = bin2hex($random)
3 голосов
/ 04 марта 2013

Решили, что мне нужно что-то более надежное и дополненное функционалом.Так вот что я придумал.

/**
 * 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;

 } 
0 голосов
/ 16 февраля 2017
  private  function generateCodeSecurity()
  {
    list($usec, $sec) = explode(" ", microtime());
    $micro = usec + $sec;

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

    return  rand($str,  $micro);

  }

С помощью этого небольшого кода вы можете сгенерировать случайное число в диапазоне от 7 до 11 чисел.

Использование функций 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

Передача параметров в эту функцию: rand ();

 rand($str,  $micro);

и возврат;

пример:

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

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

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

echo $finalresult; 

результат: 1297793555

Я думаю, что трудно повторить это число, потому что это никогда не будет тот же день, ни тот же час, ни те же миллисекунды времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...