Correction de faille de sécurité // __DIR__ = chemin absolu du dossier functions : le require fonctionne ainsi quel que soit // le dossier depuis lequel le script est appelé (pages/, scripts/, racine...) require_once(__DIR__ . '/../../idDiscord.php'); // EXEMPLE de a quoi ressemble idDiscord : // define('ID_DISCORD1', 'https://discord.com/api/webhooks/URL_WEBHOOK1'); // define('ID_DISCORD2', 'https://discord.com/api/webhooks/URL_WEBHOOK2'); // Fonction qui va ENVOYER des logs sur le webhook discord function sendLog($action, $user = "") { // Si le webhook n'est pas configuré on ne bloque pas le site if (!defined('ID_DISCORD1') || ID_DISCORD1 == '') { return false; } $webhook = ID_DISCORD1; // URL du webhook Discord // Si l'utilisateur n'est pas précisé on prend celui de la session (connecté) if ($user == "" && isset($_SESSION['username'])) { $user = $_SESSION['username']; } $contenuLog = "**Nouvelle log du portfolio**\n\n"; $contenuLog .= "**Action :** " . $action . "\n"; if ($user != "") { $contenuLog .= "**Utilisateur :** " . $user . "\n"; } else { $contenuLog .= "**Utilisateur :** non défini" . "\n"; } $contenuLog .= "**IP :** " . ($_SERVER['REMOTE_ADDR'] ?? 'inconnue') . "\n"; $contenuLog .= "**Date :** " . date('d/m/Y H:i:s'); $data = [ "content" => $contenuLog ]; $dataJson = json_encode($data); $ch = curl_init($webhook); // On démarre une ressource curl curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJson); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Timeouts courts : si Discord est lent ou down, le site ne doit pas être ralenti curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 800); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1500); // CORRECTION DU BUG : curl_exec() n'était jamais appelé, la requête n'était // donc jamais envoyée à Discord. C'est pour ça que les logs n'ont jamais marché. // (pas de curl_close : déprécié depuis PHP 8.5, la ressource se libère toute seule) curl_exec($ch); $codeHttp = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Discord renvoie 204 quand le message est bien envoyé return $codeHttp == 204; } // Log de visite de page : appelée par le header sur toutes les pages // Anti-spam : Discord limite à ~30 messages/minute par webhook, donc une même page // n'est loguée qu'une fois par minute et par visiteur (stocké dans sa session) function sendPageLog() { $page = basename($_SERVER['PHP_SELF'] ?? 'inconnue'); if (!isset($_SESSION['pages_log'])) { $_SESSION['pages_log'] = []; } $maintenant = time(); if (isset($_SESSION['pages_log'][$page]) && ($maintenant - $_SESSION['pages_log'][$page]) < 60) { return; // Page déjà loguée il y a moins d'une minute pour ce visiteur } $_SESSION['pages_log'][$page] = $maintenant; sendLog("Visite de la page " . $page); }