PHP 表单登录失败次数限制与锁定机制实现
在Web开发中,用户登录是常见的需求。为了提高网站的安全性,防止恶意用户通过暴力破解等方式非法登录,实现登录失败次数限制与锁定机制是非常必要的。本文将围绕PHP表单登录,详细介绍如何实现登录失败次数限制与锁定机制。
1. 前言
登录失败次数限制与锁定机制的主要目的是防止恶意用户通过不断尝试密码来非法登录系统。以下是实现该机制的基本思路:
1. 记录用户登录尝试的次数。
2. 当用户连续登录失败达到一定次数时,锁定用户账号一段时间。
3. 在锁定时间内,用户无法再次尝试登录。
2. 数据库设计
为了实现登录失败次数限制与锁定机制,我们需要在数据库中增加以下字段:
- `login_attempts`:记录用户登录尝试的次数。
- `lock_time`:记录用户账号被锁定的结束时间。
以下是一个简单的数据库表结构示例:
sql
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`login_attempts` int(11) NOT NULL DEFAULT '0',
`lock_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. PHP代码实现
3.1 用户登录表单
我们需要创建一个用户登录表单,如下所示:
html
用户名:
密码:
登录
3.2 登录处理逻辑
在`login.php`文件中,我们需要处理用户登录请求,并实现登录失败次数限制与锁定机制。
php
connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 获取用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];
// 查询用户信息
$result = $mysqli->query("SELECT FROM user WHERE username='$username'");
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'])) {
// 密码正确,重置登录尝试次数
$mysqli->query("UPDATE user SET login_attempts=0, lock_time=NULL WHERE username='$username'");
// 登录成功,设置session
$_SESSION['username'] = $username;
echo "登录成功!";
} else {
// 密码错误,增加登录尝试次数
$login_attempts = $user['login_attempts'] + 1;
$lock_time = date('Y-m-d H:i:s', strtotime('+5 minutes')); // 锁定5分钟
$mysqli->query("UPDATE user SET login_attempts=$login_attempts, lock_time='$lock_time' WHERE username='$username'");
if ($login_attempts >= 3) {
echo "连续登录失败3次,账号已被锁定5分钟。";
} else {
echo "密码错误,您还有" . (3 - $login_attempts) . "次机会。";
}
}
} else {
echo "用户名不存在。";
}
$mysqli->close();
?>
3.3 登录页面
在登录页面,我们可以添加一个提示信息,告知用户登录失败次数限制与锁定机制:
html
Comments NOTHING