Подтвердить что ты не робот

Создание кода подтверждения для подтверждения по электронной почте

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

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

4b9b3361

Ответ 1

$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));

Ответ 2

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

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

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

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

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

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

Ответ 3

В принятом ответе предлагается использовать хэш 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)

Ответ 4

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

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

 } 

Ответ 5

  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);

и return;

пример:

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

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

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

echo $finalresult; 

результат: 1297793555

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