false, 'message' => 'Méthode non autorisée.']); exit; } /* ── Lecture du body (JSON ou form-data) ───────────────────── */ $contentType = $_SERVER['CONTENT_TYPE'] ?? ''; if (str_contains($contentType, 'application/json')) { $raw = file_get_contents('php://input'); $data = json_decode($raw, true) ?? []; } else { $data = $_POST; } /* ── Récupération & nettoyage des champs ───────────────────── */ $name = trim(strip_tags($data['name'] ?? '')); $email = trim(strip_tags($data['email'] ?? '')); $subject = trim(strip_tags($data['subject'] ?? 'Contact depuis le site')); $message = trim(strip_tags($data['message'] ?? '')); /* ── Validation ────────────────────────────────────────────── */ $errors = []; if (empty($name) || mb_strlen($name) < 2) { $errors[] = 'Le nom doit contenir au moins 2 caractères.'; } if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Adresse email invalide.'; } if (empty($message) || mb_strlen($message) < 10) { $errors[] = 'Le message doit contenir au moins 10 caractères.'; } if (mb_strlen($name) > 100 || mb_strlen($email) > 254 || mb_strlen($message) > 5000) { $errors[] = 'Un des champs dépasse la longueur maximale autorisée.'; } if (!empty($errors)) { http_response_code(422); echo json_encode(['success' => false, 'message' => implode(' ', $errors)]); exit; } /* ── Honeypot anti-bot (champ caché "website" dans le HTML) ── */ if (!empty($data['website'])) { // Simuler un succès pour ne pas signaler le bot echo json_encode(['success' => true, 'message' => 'Message envoyé avec succès !']); exit; } /* ── Rate limiting par IP ───────────────────────────────────── */ if (RATE_LIMIT_ENABLED) { $ip = preg_replace('/[^a-f0-9:.]/', '', $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'); $file = RATE_LIMIT_DIR . md5($ip) . '.json'; $now = time(); $records = []; if (!is_dir(RATE_LIMIT_DIR)) { @mkdir(RATE_LIMIT_DIR, 0700, true); } if (file_exists($file)) { $records = json_decode(file_get_contents($file), true) ?? []; // Ne garder que les entrées dans la fenêtre de temps $records = array_filter($records, fn($t) => ($now - $t) < RATE_LIMIT_WINDOW); $records = array_values($records); } if (count($records) >= RATE_LIMIT_MAX) { http_response_code(429); echo json_encode(['success' => false, 'message' => 'Trop de messages envoyés. Veuillez patienter avant de réessayer.']); exit; } $records[] = $now; file_put_contents($file, json_encode($records), LOCK_EX); } /* ── Construction de l'email ───────────────────────────────── */ $emailSubject = SUBJECT_PREFIX . $subject; $emailBody = "Nouveau message depuis le formulaire de contact OmégaKube\n"; $emailBody .= str_repeat('─', 55) . "\n\n"; $emailBody .= "Nom : {$name}\n"; $emailBody .= "Email : {$email}\n"; $emailBody .= "Objet : {$subject}\n\n"; $emailBody .= "Message :\n{$message}\n\n"; $emailBody .= str_repeat('─', 55) . "\n"; $emailBody .= "Envoyé le : " . date('d/m/Y à H:i:s') . "\n"; $emailBody .= "IP : " . ($_SERVER['REMOTE_ADDR'] ?? 'inconnue') . "\n"; /* Version HTML de l'email */ $emailBodyHtml = '