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
字段是否包含哈希
电子邮件。所以,如果出现一个格式错误的散列,那么我必须捕获它,因为这意味着,用户密码是其他东西,它不是在向上迁移中生成的,因此在向下迁移中不应该反转为空字符串。再一次,我知道,这听起来有多么愚蠢,但幸运的是,这只是一个内在的、短暂的解决方案。