PHP 使用 password_verify 验证用户名和密码

PHP Username And Password Verification using password_verify

我目前正在尝试更新我不安全的登录系统。但是无法弄清楚如何合并 if (password_verify.. 命令。

如有任何帮助,我们将不胜感激。

//Create query
$qry="SELECT * FROM user WHERE username='$username' AND password='$password'";
$result=mysql_query($qry);
if($result) {
    if(mysql_num_rows($result) > 0) {
    //IF Login Successful
        session_regenerate_id();
        $user = mysql_fetch_assoc($result);
        $_SESSION['SESS_USER_ID'] = $user['user_id'];
        $_SESSION['SESS_FIRST_NAME'] = $user['username'];
        $_SESSION['SESS_LAST_NAME'] = $user['password'];
        session_write_close();
        header("location: home.php");
        exit();
    }else {
        //IF Login failed
        $errmsg_arr[] = 'user name and password not found';
        $errflag = true;
        if($errflag) {
            $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
            session_write_close();
            header("location: index.php");
            exit();
        }
    }

以下是您问题的答案和一些一般信息:

密码校验函数:

一个好的做法是在存储敏感数据之前对其进行加密。由于您不希望有恶意的人能够检索密码,因此您将使用 asymetric(单向)加密算法系列,我们称之为 hash.

您将通过使用输入的值重新生成哈希并将其与存储在数据库中的哈希进行比较来检查用户是否为您提供了正确的凭据。

在这种情况下,您不会在查询中插入任何用户输入。

您可以通过添加 salt.

来增加哈希生成的复杂性

password_hash documentation is pretty explicit and you'll find in this link 关于散列算法的 SO 讨论。

帐号creation/password更改步骤:

  • 计算用户的密码哈希值
  • 存入数据库

总结身份验证步骤:

  • 检索到用户输入
  • 调用 password_verify($user_password_inputed, $hash_retrieved_from_db) 函数
  • 如果函数返回 true,则用户已通过身份验证

SQL注入和用户输入:

为什么不建议在查询中插入用户输入?

您不应在查询中插入用户输入,因为 SQL injection 这是用户让您的数据库执行他自己的查询的一种方式。 使用注入,他可以显示或更新一些数据,而他不应该被允许这样做。

防止注射

为了防止注入,我们的想法是 sanitize/insure 用户输入不包含恶意 query/instructions。

如今,我们拥有 PDO which handle these issues by using the prepared statements.

这样的工具