我使用str_random(60)
函数生成密码重置代码。我的问题是,如果有数千人要求重置密码,这个代码是唯一的,还是可以复制?
public function postForgotPassword(){
$validator = Validator::make(Input::all(), array('email'=>'required|email'));
if($validator->fails()){
return Redirect::route('account-forgot-password')->withErrors($validator)->withInput();
}else{
$user= User::where('email', '=', Input::get('email'));
if($user->count()){
$user = $user->first();
$code = str_random(60);
$password = str_random(10);
$user->code = $code;
$user->password_temp = Hash::make($password);
if($user->save()){
Mail::send('emails.auth.forgot', array('link'=>URL::route('account-recover', $code), 'username'=>$user->username,'password'=>$password), function($message) use($user)
{$message->to($user->email, $user->username)->subject('your new pass');
});
return Redirect::route('home')->with('global', 'we have sent you an new password');
}
}
}
return Redirect::route('account-change-password')->with('global', 'could not reset password');
}
public function getRecover($code){
$user = User::where('code', '=', $code)->where('password_temp', '!=', '');
if($user->count()){
$user = $user->first();
$user->password = $user->password_temp;
$user->password_temp = '';
$user->code = '';
if($user->save()){
return Redirect::route('home')->with('global', 'your account has been recoverd');
}
}
return Redirect::route('home')->with('global','could not recover you password');
}
答案 0 :(得分:4)
应该没有问题,因为密码重置代码应该绑定到用户帐户,使其成为复合密钥,因此是唯一的。
所有它必须是随机的,而不是唯一的字符串,因为用户必须输入他们的电子邮件地址以及密码重置代码才能使其正常工作。因此,如果Bob和James都有12345的重置字符串,那么他们输入它就不会有冲突,因为bob会输入bob@example.com 12345而james会输入james@acme.com 12345;因此它们都是独特的。
这并不是说你不应该有随机字符串,你当然应该。该字符串永远不应该是可猜测的。但至于它是否完全独特,无所谓。
答案 1 :(得分:2)
如果它生成随机输出,那么它偶尔会重新创建相同的结果。使用60个字符的随机字符串时,其可能性非常小。
答案 2 :(得分:1)
首先,根据定义,它并不像另一个答案中提到的那样独特。
其次,即使OpenSSL在这个位置,它也可能不够随意。有a bug in PHP implementation of OpenSSL给出了大量的碰撞,这些碰撞在以下版本中得到修复:
= 5.4.44
= 5.5.28
= 5.6.13
= 7.0.0
所以我建议不要将它用于与安全相关的目的。