PHP Forma 表单 登录失败次数限制与锁定机制

PHP Forma阿木 发布于 3 天前 3 次阅读


PHP 表单登录失败次数限制与锁定机制实现

在Web开发中,用户登录是常见的需求。为了提高网站的安全性,防止恶意用户通过暴力破解等方式非法登录,实现登录失败次数限制与锁定机制是非常必要的。本文将围绕PHP表单登录,详细讲解如何实现登录失败次数限制与锁定机制。

1. 前言

登录失败次数限制与锁定机制主要目的是为了防止恶意用户通过不断尝试密码来破解登录系统。以下是实现该机制的基本思路:

1. 记录用户登录尝试的次数。
2. 当用户连续登录失败达到一定次数时,锁定用户账号一段时间。
3. 在锁定时间内,用户无法再次尝试登录。

2. 数据库设计

为了实现登录失败次数限制与锁定机制,我们需要在数据库中增加以下字段:

- `login_attempts`:记录用户登录尝试的次数。
- `lock_time`:记录用户账号被锁定的结束时间。

以下是一个简单的用户表结构示例:

sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
login_attempts INT DEFAULT 0,
lock_time DATETIME DEFAULT NULL
);

3. PHP代码实现

3.1 登录表单

我们需要创建一个登录表单,用户可以通过该表单提交用户名和密码。

html

用户名:

密码:

3.2 登录处理

在`login.php`文件中,我们需要处理用户提交的登录请求,并实现登录失败次数限制与锁定机制。

php
connect_error) {
die("连接失败: " . $mysqli->connect_error);
}

// 获取用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];

// 查询用户信息
$query = "SELECT FROM users WHERE username = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
$user = $result->fetch_assoc();

// 检查用户是否被锁定
if ($user['lock_time'] && $user['lock_time'] > date('Y-m-d H:i:s')) {
echo "账号已被锁定,请稍后再试。";
exit;
}

// 验证密码
if (password_verify($password, $user['password'])) {
// 登录成功,重置登录尝试次数
$query = "UPDATE users SET login_attempts = 0 WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("i", $user['id']);
$stmt->execute();

// 登录成功,设置session
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];

echo "登录成功!";
} else {
// 登录失败,增加登录尝试次数
$login_attempts = $user['login_attempts'] + 1;
$query = "UPDATE users SET login_attempts = ? WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ii", $login_attempts, $user['id']);
$stmt->execute();

// 检查是否达到登录失败次数限制
if ($login_attempts >= 3) {
// 锁定账号
$lock_time = date('Y-m-d H:i:s', strtotime('+5 minutes'));
$query = "UPDATE users SET lock_time = ? WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("si", $lock_time, $user['id']);
$stmt->execute();

echo "账号已被锁定,请稍后再试。";
} else {
echo "用户名或密码错误,您还有 " . (3 - $login_attempts) . " 次机会。";
}
}
} else {
echo "用户不存在。";
}

$mysqli->close();
?>

3.3 登录页面

在登录页面,我们可以添加一个提示信息,告知用户登录失败次数和锁定状态。

html

4. 总结

本文详细讲解了如何使用PHP实现表单登录失败次数限制与锁定机制。通过在数据库中记录登录尝试次数和锁定时间,我们可以有效地防止恶意用户通过暴力破解等方式非法登录。在实际应用中,可以根据需求调整登录失败次数限制和锁定时间,以提高网站的安全性。