【问题标题】:Implement password_compat [closed]实施 password_compat [关闭]
【发布时间】:2012-12-29 20:01:52
【问题描述】:

我已经用这个库正确实现了哈希的创建,只改变了成本值。现在我坚持实际验证用户。对于我当前的系统,我还必须检查用户是否已激活,然后还要启动会话。这就是我所拥有的:

 <?php 
require('core/init.php');

// Required field names
$required = array('username', 'password');

// Loop over field names, make sure each one exists and is not empty
$error = false;
    foreach($required as $field) {
        if (empty($_POST[$field])) {
        $error = true;
        }
    }
//This is what will make the password 
$form_password = $_POST['password'];
$hash = password_hash($form_password, PASSWORD_BCRYPT);
    if ($error) {
        echo "Please Check username and password field!";
    }
        else { 
                if (password_verify($form_password, $hash)) {
                    $member_username = $_POST['username'];
                    $query = $dbh->prepare("SELECT * FROM users WHERE username = :user");
                    $query->bindParam(':user', $member_username);
                    $query->execute();
                    $row = $query->fetch();

                        if($row['activated'] > 0){
                            $_SESSION["user_id"] = $row['user_id'];
                            header("location: login_success.php");

                            }   else {
                                    echo "Account not activated wait for system administrator!";

                                }


                } else {
                            Echo "Wrong password or username please <a href='index.php'><bold>Retry!</bold></a>";

                        }


        }

如果密码验证实际上是真的,我所做的是运行一个查询。该查询然后获取激活的行以检查该值是否大于 0,如果不是,则未激活用户。

但是我的错误是,无论我输入什么,我都会不断收到错误的密码或用户名,请重试!

我知道密码和用户没有错。我第二次猜测自己是否正确实施了 password_compat 的验证部分。

任何帮助都会很棒。谢谢你。

编辑:

dev-null-dweller 在 cmets 中回答的问题。

问题:我没有意识到我不能将库 $password 和 $hash 变量用作全局变量。所以为了修复它,我创建了变量并且一切正常。谢谢!

【问题讨论】:

  • $password$hash从何而来?
  • 这是一个库,它不设置任何全局变量。我在问您是否知道 $password$hash 在您的代码中都未定义。
  • 这不是一个真正的问题,它将被关闭。
  • 这是疏忽或缺乏普遍理解,不是真正的问题……除此之外,它对整个社区也没有任何帮助(没有建设性)。
  • @RaGe10940 没有暗示您的具体问题。但是这句话是有缺陷的。相信我:有很多愚蠢的问题。

标签: php validation authentication pdo cryptography


【解决方案1】:

$password$hash 在您的代码中均未定义。至于$password,可以从$_POST获取,但$hash是从数据库中获取的,所以验证密码前需要查询:

if ($error) {
    echo "Please Check username and password field!";
} else {
    $member_username = $_POST['username'];
    $form_password = $_POST['password'];
    $query = $dbh->prepare("SELECT * FROM users WHERE username = :user");
    $query->bindParam(':user', $member_username);
    $query->execute();
    $row = $query->fetch();
    if (!$row || !password_verify($form_password, $row['password'])) {
        if ($row['activated'] > 0) {
            $options = array(/* Your current hashing options */);
            $algorithm = PASSWORD_BCRYPT;
            if (password_needs_rehash($row['password'], $algorithm, $options)) {
                $hash = password_hash($row['password'], $algorithm, $options);
                /* Store new hash in db */
            }
            $_SESSION["user_id"] = $row['user_id'];
            header("location: login_success.php");
        } else {
            echo "Account not activated wait for system administrator!";
        }
    } else {
        Echo "Wrong password or username please <a href='index.php'><b>Retry!</b></a>";
    }
}

【讨论】:

  • @RaGe10940 抱歉,现在我真的不知道你在做什么,但我觉得你做错了......
  • 你没看错(至少那部分)。但它没有告诉你在去verify(这就是你正在做的事情)之前创建一个新的哈希;)验证函数有两个参数。用户提供的密码和用户记录中保存在数据库中的哈希值。
  • 就像我说的,你完全错了。使用类似的代码,用户可以使用任何密码登录。哈希应该计算一次,存储在数据库中并在我回答时检索以进行验证。现在,您正在计算任何提交的密码的哈希值并立即检查它,而不会将其与任何用户相关联。
  • @RaGe10940 :) 基本上你需要做的是以下几点: 1. 从数据库中检索哈希。 2. 使用从数据库获得的哈希值和用户在verify() 函数中提供的密码。 3. 当提供的密码有效时,通过password_needs_rehash 运行哈希。 4. 如果密码需要重新哈希,就像用户注册时一样再次哈希(password_hash)并将新哈希保存在数据库中
  • @RaGe10940 当用户在您的站点上注册时,会根据当前最安全的设置创建哈希。然而,随着时间的流逝,计算机变得越来越快,散列算法也被破坏了。为了确保存储的哈希与此保持同步,您需要确保保存的哈希保持“最新”。一个简单的例子是目前在 PHP 中使用最安全的东西是bcrypt。但是我可以看到 PHP 稍后支持更安全的scrypt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2021-04-16
  • 2012-07-01
  • 2010-09-12
  • 2018-01-29
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多