php - 登录脚本有时会访问错误的帐户
问题描述
我有以下注册码:
//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']
被分配了一个随机值。
我在我的代码中做错了什么,这种行为在一些非常罕见的情况下存在?我无法以任何方式复制它。
谢谢!
解决方案
推荐阅读
- sql - SQL Query - 在上面的行中使用值并向下复制
- c# - 如何初始化一个继承接口的类?
- php - PHP CURL 不适用于多维数组
- regex - 提取最后一个单词/文本多个匹配的logstash
- javascript - 导入冲突两个模块反应原生
- reactjs - 带有 react-redux-firebase 的 react-hook-form 不起作用
- android - 如何处理android webview中的firebase动态链接
- python - 在不同版本的 Python 中使用 pip 安装包
- c++ - 将一系列数字映射到 cpp 中的值的简单方法
- angular-material - 在 Angular 8 的 MatIcon 中使用 MatTooltip 导致问题