когда пользователь хочет сбросить свой пароль, я отправляю на его электронную почту 6-значный код, затем я проверяю, вводит ли пользователь соответствующий код!
Я генерирую код с помощью функции rand:
$code = rand ( 100000, 999999 );
это безопасно делать?
Нет. Допустим, вы хотите сбросить пароль привилегированного пользователя. Все, что нужно сделать злоумышленнику, — это выполнить сброс настроек для непривилегированной учетной записи (или нескольких учетных записей), которой он управляет, чтобы предсказать следующее случайное значение. Это означает, что они могут затем запросить сброс пароля для привилегированного пользователя (например, «Администратор»), а затем принять учетную запись.
Дополнительная информация:
Если вам действительно нужны непредсказуемые случайные числа для какой-либо функции безопасности, не стесняйтесь использовать эту библиотеку, которую я написал и поддерживаю:
https://github.com/resonantcore/lib/blob/master/src/Secure.php
$iRandom = \Resonantcore\Lib\Secure::random(100000, 999999);
Обратите внимание, что это скоро будет принято / реорганизовано в этот репозиторий в ближайшем будущем (и предлагаемые функции могут даже превратить его в ядро PHP 7): https://github.com/SammyK/php-src-csprng
$iRandom = random_int(100000, 999999);
Это еще не там, хотя. Мой код работает сегодня.
Если ты не веришь мне, Вы также можете проверить замечательный проект Энтони Феррары RandomLib: https://github.com/ircmaxell/RandomLib
$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new SecurityLib\Strength(SecurityLib\Strength::MEDIUM));
$iRandom = $generator->generateInt(100000, 999999);
Не использовать rand()
или же mt_rand()
для любой аутентификации (или обхода аутентификации). Когда-либо.
Кроме того, вы можете использовать что-то с большим перебором, чем 6-значное число. 32-байтовая строка в шестнадцатеричном формате должна быть достаточной для остановки как практических, так и всех известных теоретических атак.
Других решений пока нет …