Code pin_failed.php
Depuis votre terminal connectez-vous a votre Raspberry PI et rentrez la commande suivante pour créer le fichier pin_failed.php.
sudo nano /var/www/html/pin_failed.php
Copier le code suivant et coller le dans le fichier qui vient de s'ouvrir.
<?php
date_default_timezone_set('Europe/Paris');
session_start();
// Importe les constantes de index.php
const MAX_ATTEMPTS = 3;
const BLACKLIST_FILE = '/var/www/html/data/ip_blacklist.json';
// --- NOUVELLE CONSTANTE DE LOG ---
const LOG_FILE = '/var/log/camera_status.log';
header('Content-Type: application/json');
// Récupère l'IP du client
$client_ip = $_SERVER['REMOTE_ADDR'];
// Fonctions de gestion de la liste noire
function get_blacklist() {
if (file_exists(BLACKLIST_FILE)) {
$data = file_get_contents(BLACKLIST_FILE);
return json_decode($data, true) ?: [];
}
return [];
}
function is_ip_blacklisted($ip) {
$blacklist = get_blacklist();
return isset($blacklist[$ip]);
}
// 1. Incrémenter le compteur de tentatives en session
if (isset($_SESSION['pin_attempts'])) {
$_SESSION['pin_attempts']++;
} else {
$_SESSION['pin_attempts'] = 1;
}
// 2. Vérifier si la limite est atteinte
if ($_SESSION['pin_attempts'] >= MAX_ATTEMPTS) {
// 3. Ajouter l'IP à la liste noire (fichier JSON)
if (!is_ip_blacklisted($client_ip)) {
$blacklist = get_blacklist();
$timestamp = date('Y-m-d H:i:s');
$blacklist[$client_ip] = ['blocked_time' => $timestamp, 'reason' => 'Tentatives de PIN dépassées'];
file_put_contents(BLACKLIST_FILE, json_encode($blacklist, JSON_PRETTY_PRINT));
// >> LOG DU BLOCAGE (NOUVEAU) <<
// Utilisation de file_put_contents en mode APPEND pour écrire dans le log.
$log_message = sprintf("[%s] [SECURITY] IP Blocked: %s - Reason: PIN attempts exceeded (%d)\n",
$timestamp,
$client_ip,
MAX_ATTEMPTS
);
// Ajoute le message à la fin du fichier de log
file_put_contents(LOG_FILE, $log_message, FILE_APPEND | LOCK_EX);
}
// 4. Répondre pour forcer le rechargement de la page
echo json_encode(['status' => 'blocked', 'message' => 'Tentatives dépassées. Blocage IP.']);
session_destroy();
} else {
// 5. Répondre avec le nouveau nombre de tentatives restantes
echo json_encode([
'status' => 'failed',
'attempts_left' => MAX_ATTEMPTS - $_SESSION['pin_attempts']
]);
}
?>