当用户想要重置密码时,我会向他的电子邮件发送一个6位数的代码,然后检查用户是否输入了匹配的代码!
我使用rand函数生成代码:
$code = rand ( 100000, 999999 );
这样做是否安全?
答案 0 :(得分:2)
否。我们假设您要重置特权用户的密码。攻击者所要做的就是为他们控制的非特权帐户(或多个帐户)发出一堆重置,以预测下一个随机值。这意味着他们可以为特权用户请求密码重置(例如" Admin"),然后接管帐户。
更多信息:
如果你真的想要任何类型的安全功能的不可预测的随机数,请随意使用我编写和维护的这个库:
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);
但是,它还不存在。我的代码今天有效。
如果您不信任我,您还可以查看Anthony Ferrara的精彩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字节字符串应足以阻止实际和所有已知的理论攻击。