php实现 限制登录
限制登录功能实现
在PHP中实现限制登录功能,可以通过多种方式来实现,包括限制登录尝试次数、IP限制、时间限制等。以下是几种常见的实现方法:
限制登录尝试次数
使用会话或数据库记录用户的登录尝试次数,超过指定次数后锁定账户或要求验证码。

session_start();
$max_attempts = 3;
$lockout_time = 300; // 5分钟
if (!isset($_SESSION['login_attempts'])) {
$_SESSION['login_attempts'] = 0;
}
if ($_POST['username'] && $_POST['password']) {
if ($_SESSION['login_attempts'] >= $max_attempts) {
if (!isset($_SESSION['lockout_time'])) {
$_SESSION['lockout_time'] = time();
} elseif (time() - $_SESSION['lockout_time'] < $lockout_time) {
die("登录尝试过多,请稍后再试。");
} else {
$_SESSION['login_attempts'] = 0;
unset($_SESSION['lockout_time']);
}
}
// 验证用户名和密码
if ($valid_credentials) {
$_SESSION['login_attempts'] = 0;
// 登录成功逻辑
} else {
$_SESSION['login_attempts']++;
die("用户名或密码错误。");
}
}
IP限制登录
通过记录IP地址限制特定IP的登录尝试次数。
$ip = $_SERVER['REMOTE_ADDR'];
$max_attempts = 5;
$lockout_time = 600; // 10分钟
// 假设使用数据库存储IP尝试次数
$stmt = $pdo->prepare("SELECT attempts, last_attempt FROM login_attempts WHERE ip = ?");
$stmt->execute([$ip]);
$result = $stmt->fetch();
if ($result) {
if ($result['attempts'] >= $max_attempts && time() - strtotime($result['last_attempt']) < $lockout_time) {
die("IP被暂时锁定,请稍后再试。");
}
}
// 验证失败时更新尝试次数
if (!$valid_credentials) {
if ($result) {
$stmt = $pdo->prepare("UPDATE login_attempts SET attempts = attempts + 1, last_attempt = NOW() WHERE ip = ?");
} else {
$stmt = $pdo->prepare("INSERT INTO login_attempts (ip, attempts, last_attempt) VALUES (?, 1, NOW())");
}
$stmt->execute([$ip]);
die("登录失败。");
}
时间限制登录
限制用户在特定时间段内登录。

$start_time = strtotime("09:00:00");
$end_time = strtotime("17:00:00");
$current_time = time();
if ($current_time < $start_time || $current_time > $end_time) {
die("系统仅在09:00至17:00开放登录。");
}
验证码限制
在多次登录失败后要求用户输入验证码。
session_start();
if ($_SESSION['login_attempts'] > 2 && empty($_POST['captcha'])) {
die("请输入验证码。");
}
if ($_POST['captcha'] != $_SESSION['captcha_code']) {
die("验证码错误。");
}
账户锁定机制
通过数据库标记账户锁定状态,管理员手动解锁或自动解锁。
// 检查账户是否被锁定
$stmt = $pdo->prepare("SELECT is_locked FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);
$user = $stmt->fetch();
if ($user['is_locked']) {
die("账户已被锁定,请联系管理员。");
}
// 锁定账户逻辑
if ($_SESSION['login_attempts'] > 5) {
$stmt = $pdo->prepare("UPDATE users SET is_locked = 1 WHERE username = ?");
$stmt->execute([$_POST['username']]);
die("账户已被锁定。");
}
以上方法可以单独使用或组合使用,根据实际需求调整参数和逻辑。






