bool, 'error' => string|null] */ public static function validateUpload($file) { $result = ['valid' => true, 'error' => null]; // Vérifier les erreurs d'upload PHP if ($file['error'] !== UPLOAD_ERR_OK) { $result['valid'] = false; $result['error'] = 'Erreur lors de l\'upload'; return $result; } // Vérifier la taille if ($file['size'] > MAX_FILE_SIZE) { $result['valid'] = false; $result['error'] = 'Le fichier dépasse la taille maximale autorisée'; return $result; } // Vérifier l'extension $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); if (!isAllowedExtension($extension)) { $result['valid'] = false; $result['error'] = 'Extension de fichier non autorisée'; return $result; } return $result; } /** * Sécurise les sorties HTML * @param string $text Texte à sécuriser * @return string */ public static function escape($text) { return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); } /** * Génère un token CSRF * @return string */ public static function generateCSRFToken() { if (!isset($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } return $_SESSION['csrf_token']; } /** * Vérifie un token CSRF * @param string $token Token à vérifier * @return bool */ public static function verifyCSRFToken($token) { return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token); } /** * Liste les fichiers uploadés * @return array */ public static function listFiles() { $files = []; foreach (glob(UPLOAD_DIR . '*') as $file) { $info = pathinfo($file); $files[] = [ 'name' => basename($file), 'size' => filesize($file), 'extension' => strtolower($info['extension']), 'uploaded' => filemtime($file), 'preview_type' => getPreviewType($info['extension']) ]; } return $files; } } // Vérifier et mettre à jour l'activité si l'utilisateur est connecté if (Cyla::isLoggedIn()) { Cyla::updateActivity(); }