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']
    ]);
}
?>