mon-site-perso/admin/login.php
2025-09-12 10:57:48 +02:00

61 lines
No EOL
2.9 KiB
PHP

<?php
require_once 'config.php';
$msg = "";
$client_ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
// Vérifier si l'IP est bloquée
if (!checkLoginAttempts($client_ip)) {
$remaining_time = LOGIN_LOCKOUT_TIME - (time() - json_decode(file_get_contents(__DIR__ . '/login_attempts.json'), true)[$client_ip]['last_attempt']);
$msg = '<span style="color:red">Trop de tentatives de connexion. Réessayez dans ' . ceil($remaining_time / 60) . ' minutes.</span>';
} else {
// Traitement du formulaire de connexion
if ($_POST && isset($_POST['username']) && isset($_POST['userPassword']) && isset($_POST['csrf_token'])) {
// Vérifier le token CSRF
if (!verifyCSRFToken($_POST['csrf_token'])) {
$msg = '<span style="color:red">Token de sécurité invalide. Veuillez réessayer.</span>';
} else {
$username = sanitizeInput($_POST['username']);
$password = $_POST['userPassword'];
// Vérifier les identifiants
if ($username === ADMIN_USERNAME && password_verify($password, ADMIN_PASSWORD_HASH)) {
// Connexion réussie
session_regenerate_id(true);
$_SESSION['connected'] = true;
$_SESSION['username'] = $username;
$_SESSION['last_activity'] = time();
// Supprimer les tentatives de connexion en cas de succès
recordLoginAttempt($client_ip, true);
$msg = '<span style="color:green">Connexion réussie !</span><br><a href="?page=home">Accéder à l\'administration</a>';
} else {
// Connexion échouée
recordLoginAttempt($client_ip, false);
$msg = '<span style="color:red">Identifiants incorrects.</span>';
// Ajouter un délai pour ralentir les attaques par force brute
sleep(2);
}
}
}
}
?>
<section class="login" id="admin-sanctuary">
<h2>Connexion</h2>
<?= $msg; ?>
<form method="post" action="./?page=login" style="margin-top: 1rem;" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars(generateCSRFToken()); ?>">
<div style="margin-bottom: 1.5rem;">
<label for="username" style="display: block; margin-bottom: 0.5rem; font-weight: 500;">Utilisateur</label>
<input type="text" name="username" id="username" placeholder="Utilisateur" required autocomplete="username" />
</div>
<div style="margin-bottom: 1.5rem;">
<label for="userPassword" style="display: block; margin-bottom: 0.5rem; font-weight: 500;">Mot de passe</label>
<input type="password" name="userPassword" id="userPassword" placeholder="Mot de passe" required autocomplete="current-password" />
</div>
<button type="submit" class="btn" id="admin-login">Se connecter</button>
</form>
</section>