Создание кода подтверждения для подтверждения по электронной почте
используя PHP, каковы некоторые способы генерации случайного кода подтверждения, который может храниться в БД и использоваться для подтверждения по электронной почте? Я не могу даже подумать о том, как создать уникальный номер, который может быть сгенерирован из профиля пользователя. Таким образом, я могу использовать функцию, чтобы сделать число достаточно маленьким, чтобы быть включенным в URL (ссылка). Помните, что пользователь должен нажать на ссылку "Подтвердить/активировать" свой аккаунт. Если я не могу использовать числа, у меня их нет. проблемы с использованием букв и цифр.
с учетом сказанного, я попытался хэшировать имя пользователя вместе с" солью " для генерации случайного кода. Я знаю, что должен быть лучший способ, так что давай послушаем.
5 ответов
$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) Создайте ссылку для включения в Email, используйте уникальный идентификатор Это будет выглядеть примерно так
Добро пожаловать имя пользователя Спасибо за регистрацию.
Пожалуйста, нажмите на ссылку ниже, чтобы активировать свой аккаунт
domain.com/register.php?uid=100&activate=1
4) обновите активированное поле до true
alt-текст 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
решил, что мне нужно что-то более надежное и добавили новые функции. Вот что я придумал.
/**
* 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()
. The документация для 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("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
я думаю, что трудно повторить это число, по той причине, что его никогда не будет тот же день, тот же час, те же миллисекунды времени.