Intereting Posts

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

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

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

Solutions Collecting From Web of "Создание кода подтверждения для подтверждения по электронной почте"

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

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

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

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

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

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

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

4) Обновите активированное поле до значения true

alt text http://img.ruphp.com/php/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 

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

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

В принятом ответе предлагается использовать хэш 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) 
  private function generateCodeSecurity() { list($usec, $sec) = explode(" ", microtime()); $micro = usec + $sec; $hoy = date("Ymd"); $str = str_replace('-','',$hoy); return rand($str, $micro); } 

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

Использование php-функций:

 Rand (); Microtime () $hoy = date("Ymd"); $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("Ymd"); $str = str_replace('-','',$hoy); $finalresult = rand($str, $micro); echo $finalresult; 

результата: 1297793555

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