Php 检查哈希有效性
我正在尝试根据数据库中存储的无效哈希值验证密码。在这种情况下,我的应用程序没有得到Php 检查哈希有效性,php,yii,hash,yii2,Php,Yii,Hash,Yii2,我正在尝试根据数据库中存储的无效哈希值验证密码。在这种情况下,我的应用程序没有得到false(如我所想),而是死于无效哈希异常 在将哈希提交给validatePassword之前,是否有任何内置的Yii2方法来验证哈希,从而更温和地处理这种情况 或者我剩下的唯一方法就是复制validatePassword使用的代码: if (!preg_match('/^\$2[axy]\$(\d\d)\$[\.\/0-9A-Za-z]{22}/', $hash, $matches) || $matches[1
false
(如我所想),而是死于无效哈希
异常
在将哈希提交给validatePassword
之前,是否有任何内置的Yii2方法来验证哈希,从而更温和地处理这种情况
或者我剩下的唯一方法就是复制validatePassword
使用的代码:
if (!preg_match('/^\$2[axy]\$(\d\d)\$[\.\/0-9A-Za-z]{22}/', $hash, $matches) || $matches[1] < 4 || $matches[1] > 30) {
throw new InvalidParamException('Hash is invalid.');
}
if(!preg\u match('/^\$2[axy]\$(\d\d)\$[\.\.\/0-9A-Za-z]{22}/',$hash,$matches)\\$matches[1]<4|||$matches[1]>30){
抛出新的InvalidParamException('哈希无效');
}
当哈希无效时,只需调用我自己的代码,而不调用
validatePassword
?您可以在密码验证中始终使用try
-catch
块:
/**
* Validates password
*
* @param string $password password to validate
* @return boolean if password provided is valid for current user
*/
public function validatePassword($password)
{
try {
$data = Yii::$app->getSecurity()->validatePassword($password, $this->password_hash);
return $data;
} catch(\yii\base\InvalidParamException $e) {
return false;
}
}
诸如此类,但如果哈希已经格式不正确,为什么还要尝试验证它呢?也许某个罪犯会在那里传递一些不好的信息,这些信息会通过你的登录等等。很好,我只是忘记了
试试。。。捕获
!:>我正在向下迁移中尝试这段代码,以逆转我在向上迁移中所做的。在向上迁移中,我在用户表中搜索所有密码为空的用户。对于其中任何一个,我都是通过散列他/她的电子邮件来生成密码。我知道,这是愚蠢的,但这只是一个内部和暂时的解决方案,永远不会公开,所以应该适应。在向下迁移中,我必须反转此操作,所以我需要知道数据库中存储的密码是否是用户电子邮件的散列。如果是这样,我想将其重置为空字符串。除了实际使用validatePassword($this->email,$this->password)
之外,我还没有找到更好的方法来检查password
字段是否包含哈希电子邮件。所以,如果出现一个格式错误的散列,那么我必须捕获它,因为这意味着,用户密码是其他东西,它不是在向上迁移中生成的,因此在向下迁移中不应该反转为空字符串。再一次,我知道,这听起来有多么愚蠢,但幸运的是,这只是一个内在的、短暂的解决方案。