首页 > 解决方案 > 登录脚本有时会访问错误的帐户

问题描述

我有以下注册码:

//Register user
if (isset($_POST['btnRegister'])) {

    //Check if mail already exists
    $stmt = $conn->prepare("SELECT email FROM user_account WHERE email=?");
    $stmt->bind_param("s", $email_);
    $email_ = $_POST['email'];
    $stmt->execute();
    $stmt->bind_result($email);
    $stmt->store_result();

    if ($stmt->num_rows > 0) {
        echo "Dit account bestaat al";
        $stmt->close();
    } else {
        $insert_id = 0;

        //Add to Database
        $stmt = $conn->prepare("INSERT INTO user_account (firstname, lastname, email, password, address, tel) VALUES (?, ?, ?, ?, ?, ?)");
        $stmt->bind_param("ssssss", $firstname_, $lastname_, $email_, $password_, $address_, $tel_);
        $firstname_ = $_POST['firstname'];
        $lastname_ = $_POST['lastname'];
        $email_ = $_POST['email'];
        $password_ = password_hash($_POST['password'], PASSWORD_DEFAULT);
        $address_ = $_POST['address'];
        $tel_ = $_POST['tel'];
        if ($stmt->execute()) {
           //Send mail

        }
        $insert_id = $stmt->insert_id;
        $stmt->close();

        $_SESSION['user_id'] = $insert_id;
    }
}

以及以下登录代码:

//Login user
    if (isset($_POST['btnLogin'])) {
        $stmt = $conn->prepare("SELECT ID, password FROM user_account WHERE email=?");
        $stmt->bind_param("s", $email_);
        $email_ = $_POST['email'];
        $stmt->execute();
        $stmt->bind_result($ID, $password);
        $stmt->fetch();

        if (password_verify($_POST['password'], $password)) {
            $_SESSION['user_id'] = $ID;
            header("Location: /account/");
        } else {
            header("Location: /index#login-of-registreer");
        }
    }

数据库表:

+------------+-----------------+------+-----+---------+----------------+
| Field      | Type            | Null | Key | Default | Extra          |
+------------+-----------------+------+-----+---------+----------------+
| ID         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| firstname  | varchar(250)    | NO   |     | NULL    |                |
| lastname   | varchar(250)    | NO   |     | NULL    |                |
| email      | varchar(250)    | NO   | UNI | NULL    |                |
| tel        | varchar(16)     | YES  |     | NULL    |                |
| password   | varchar(250)    | NO   |     | NULL    |                |
| address    | varchar(250)    | NO   |     | NULL    |                |
| postalcode | varchar(4)      | YES  |     | NULL    |                |
+------------+-----------------+------+-----+---------+----------------+

这段代码在 99.9% 的情况下都能完美运行。当输入错误的邮件/密码时,您无法访问,当输入正确的组合时,您会很好地重定向到您的个人帐户空间。email 在数据库表中是唯一的。

但是,我收到过一两个非常奇怪的案例的报告。这是一个试图登录的用户,并获得了一个非常随机的用户帐户的访问权限。似乎$_SESSION['user_id']被分配了一个随机值。

我在我的代码中做错了什么,这种行为在一些非常罕见的情况下存在?我无法以任何方式复制它。

谢谢!

标签: phpauthentication

解决方案


推荐阅读