From 08875d3b5a186cc5be96fbab6755a4ecec37af2b Mon Sep 17 00:00:00 2001 From: Esteban Date: Fri, 28 Aug 2026 00:04:48 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20mode=20pr=C3=A9sentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- captcha.php | 275 ++++++++------- database/scriptDatabase.sql | 20 ++ elements/footer.php | 18 +- elements/header.php | 10 +- functions/assets.php | 32 ++ functions/presentationAuth.php | 158 +++++++++ pages/admin.php | 226 +++++++++--- pages/contact.php | 19 +- pages/details.php | 126 ++++--- pages/home.php | 76 ++-- pages/login.php | 12 +- pages/presentation.php | 483 ++++++++++++++++++++++++++ scripts/checkLogin.php | 7 +- scripts/unlockPresentationAttempt.php | 29 ++ scripts/updatePresentationPin.php | 51 +++ scripts/updateSettings.php | 9 +- styles/presentation.css | 261 ++++++++++++++ styles/primary_css.css | 239 +++++++++++++ 18 files changed, 1781 insertions(+), 270 deletions(-) create mode 100644 functions/assets.php create mode 100644 functions/presentationAuth.php create mode 100644 pages/presentation.php create mode 100644 scripts/unlockPresentationAttempt.php create mode 100644 scripts/updatePresentationPin.php create mode 100644 styles/presentation.css diff --git a/captcha.php b/captcha.php index 89694f2..64a9fd2 100644 --- a/captcha.php +++ b/captcha.php @@ -4,6 +4,9 @@ require_once(__DIR__ . '/functions/security.php'); // Ajout des logs Discord (chemin via __DIR__ car captcha.php est à la racine du site) require_once(__DIR__ . '/functions/sendLogs.php'); +// Versionnement des fichiers statiques (casse le cache navigateur à chaque modif du CSS) +require_once(__DIR__ . '/functions/assets.php'); + // Recharger une nouvelle série si demandé if (isset($_GET['reload']) && $_GET['reload'] === '1') { unset($_SESSION['captcha_round']); @@ -408,153 +411,173 @@ $attemptsLeft = $round['attempts_left'] ?? 0; - +
- -
-
-
✅
-

Vérification réussie

-

Bravo, tu as repéré le(s) mail(s) frauduleux. Redirection en cours...

+ -
-

Ce que tu as repéré :

-
    - -
  • - -
-
- + // --- Écran de réussite --- + echo <<<'HTML' +
+
+
✅
+

Vérification réussie

+

Bravo, tu as repéré le(s) mail(s) frauduleux. Redirection en cours...

+HTML; -
- -
-
+ // Rappel de ce que le visiteur a correctement identifié, s'il y a quelque chose à dire + if (!empty($foundReasons)) { + echo '
'; + echo '

Ce que tu as repéré :

'; + echo '
    '; - - -
    -
    🛡️ Test anti-robot
    + foreach ($foundReasons as $reason) { + echo '
  • ' . htmlspecialchars($reason, ENT_QUOTES, 'UTF-8') . '
  • '; + } -
    -
    -

    Vérification humaine

    -

    - Sélectionne tous les emails qui te semblent frauduleux parmi les messages - ci-dessous. Certains sont plus dangereux que d'autres. -

    -
    + echo '
'; + echo '
'; + } -
- Vérification demandée - Repérer le phishing -
- + echo <<<'HTML' +
+ +
+
-
-
- Essais restants - / -
- - - -
-
+ +HTML; - - Recharger une nouvelle série - -
+ } else { - -
- + // --- Écran du test --- + echo <<<'HTML' + +
🛡️ Test anti-robot
-
-
-
- - - -
-
Test anti-robot : cochez les mails qui ressemblent à une arnaque
-
+
+
+

Vérification humaine

+

+ Sélectionne tous les emails qui te semblent frauduleux parmi les messages + ci-dessous. Certains sont plus dangereux que d'autres. +

+
-
- $mail): ?> -
- - - +
+
+ Essais restants +HTML; - - - + // Compteur d'essais restants + echo '' . htmlspecialchars((string) $attemptsLeft, ENT_QUOTES, 'UTF-8') + . ' / ' . htmlspecialchars((string) $maxAttempts, ENT_QUOTES, 'UTF-8') . ''; - - - - - - - - + // Une pastille par essai : pleine tant qu'il reste des essais, vide ensuite + echo '
'; - - - - - - -
-
+ for ($i = 0; $i < $maxAttempts; $i++) { + echo ''; + } - + echo '
'; + echo '
'; - - + // Plus d'essais disponibles : on propose une nouvelle série de mails + if ($locked) { + echo 'Recharger une nouvelle série'; + } - '; -
- - Nouvelle série - - - -
-
- - + // Message d'erreur du dernier essai raté + if ($error !== '') { + echo '
' . htmlspecialchars($error, ENT_QUOTES, 'UTF-8') . '
'; + } + + echo <<<'HTML' +
+
+
+ + + +
+
Test anti-robot : cochez les mails qui ressemblent à une arnaque
+
+ +
+HTML; + + // Un bloc "mail" cliquable par message de la série tirée au sort + foreach ($round['emails'] as $index => $mail) { + $desactive = $locked ? 'disabled' : ''; + $classeOption = $locked ? 'mail-option mail-option-disabled' : 'mail-option '; + + echo ''; + } + + echo '
'; + echo '
'; + + // Jeton de la série en cours : permet de vérifier les réponses côté serveur + echo ''; + + // Champ piège (honeypot) : invisible et exclu du tabulateur pour un humain, + // mais souvent rempli automatiquement par les robots qui remplissent tout + echo <<<'HTML' + + + '; + echo ''; + } + ?>
diff --git a/database/scriptDatabase.sql b/database/scriptDatabase.sql index 9f8c1f3..8e5543a 100644 --- a/database/scriptDatabase.sql +++ b/database/scriptDatabase.sql @@ -114,6 +114,26 @@ CREATE TABLE IF NOT EXISTS logo_banners ( PRIMARY KEY (id) ); +-- Compteur de tentatives ratées sur le code PIN du "Mode présentation" (voir +-- pages/presentation.php), une ligne par IP visiteuse. ip_hash : jamais l'IP en clair, +-- juste son hash SHA-256, suffisant pour reconnaître le même visiteur sans stocker une +-- donnée personnelle. locked_until : posé une fois le nombre max de tentatives atteint, +-- au-delà duquel le visiteur doit se connecter en administrateur plutôt que ressaisir le code +CREATE TABLE IF NOT EXISTS presentation_attempts ( + ip_hash CHAR(64) NOT NULL, + attempts INT UNSIGNED NOT NULL DEFAULT 0, + locked_until DATETIME NULL, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (ip_hash) +); + +-- Contenu markdown du mode présentation. Pas de valeur par défaut pour presentation_pin_hash +-- ici volontairement : tant qu'aucun code n'est configuré depuis le panel admin, personne +-- ne peut entrer (voir verifierPinPresentation dans functions/presentationAuth.php) +INSERT INTO settings (name, value) VALUES +('presentation_markdown', '# Mode présentation\n\nContenu à venir, modifiable depuis le panel admin.') +ON DUPLICATE KEY UPDATE value = VALUES(value); + -- PDF de projects/experiences/schools : tables associées plutôt qu'une colonne sur la table -- parente, pour que les pages qui LISTENT ces éléments n'aient jamais à charger le contenu -- binaire des PDF en mémoire (seul le nom de fichier y est utilisé) diff --git a/elements/footer.php b/elements/footer.php index 0713a3f..b6d8d68 100644 --- a/elements/footer.php +++ b/elements/footer.php @@ -17,13 +17,16 @@ if (isset($_GET['success']) && $_GET['success'] === '1') { ?> - - -
- - -
- +'; + echo ''; + echo '' . $toast . ''; + echo ''; +} +?>