maxSize; } // Vérifier les erreurs d'upload if ($file['error'] !== UPLOAD_ERR_OK) { return [ 'valid' => false, 'error' => 'Erreur lors de l\'upload du fichier' ]; } // Vérifier la taille minimum if ($file['size'] < $this->minSize) { return [ 'valid' => false, 'error' => 'Le fichier est vide' ]; } // Vérifier la taille maximum if ($file['size'] > $maxSize) { return [ 'valid' => false, 'error' => 'Le fichier dépasse 100 Mo' ]; } // Vérifier que c'est un fichier uploadé if (!is_uploaded_file($file['tmp_name'])) { return [ 'valid' => false, 'error' => 'Fichier invalide' ]; } // Vérifier l'extension $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); if (!in_array($ext, $this->allowedExts, true)) { return [ 'valid' => false, 'error' => 'Extension non autorisée' ]; } // Vérifier le MIME type avec finfo $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $file['tmp_name']); finfo_close($finfo); if (!in_array($mime, $this->allowedMimes, true)) { return [ 'valid' => false, 'error' => 'Format d\'image invalide' ]; } // Vérifier que c'est vraiment une image if (!getimagesize($file['tmp_name'])) { return [ 'valid' => false, 'error' => 'Le fichier n\'est pas une image valide' ]; } return [ 'valid' => true, 'mime' => $mime, 'ext' => $ext ]; } /** * Vérifie qu'un fichier ne contient pas de code dangereux * Détecte les shells, webshells et code injecté */ public function isSafe($filePath) { if (!is_readable($filePath)) { return false; } // Vérifier que c'est vraiment une image avec getimagesize $imageInfo = @getimagesize($filePath); if (!$imageInfo) { return false; } // Si getimagesize retourne des infos, c'est une vraie image return true; } }