Files
Portfolio-Esteban/functions/avatarUpload.php
T
2026-07-03 10:56:54 +02:00

67 lines
2.7 KiB
PHP

<?php
// Fonction utilitaire de validation/lecture d'une photo de profil envoyée par formulaire
// (jeu "Presse-Citron"). Même esprit que functions/pdfUpload.php.
// Taille max acceptée côté serveur : généreuse, mais le client redimensionne déjà l'image
// avant l'envoi (voir pages/citron.php), donc en pratique un envoi normal fait quelques
// dizaines de Ko. Cette limite est un filet de sécurité si le redimensionnement côté
// navigateur est contourné (requête forgée, JS désactivé, etc.)
define('AVATAR_MAX_SIZE', 3 * 1024 * 1024); // 3 Mo
// Dimensions max acceptées (en pixels) : évite qu'une image immense (mais légère une fois
// compressée) fasse exploser le temps de décodage côté navigateur pour les autres joueurs
define('AVATAR_MAX_DIMENSION', 4000);
// Types d'image acceptés (liste blanche : pas de SVG, qui peut contenir du JavaScript)
const AVATAR_MIME_AUTORISES = ['image/jpeg', 'image/png', 'image/webp'];
// Vérifie et lit une image de profil envoyée en upload ($_FILES)
// Retourne :
// - null si aucun fichier n'a été envoyé (ce n'est pas une erreur)
// - une chaîne de texte si le fichier est invalide (message d'erreur à afficher)
// - ['mime' => ..., 'data' => ...] si l'image est valide
function lireUploadAvatar($champ = 'avatar') {
if (!isset($_FILES[$champ]) || $_FILES[$champ]['error'] === UPLOAD_ERR_NO_FILE) {
return null;
}
if ($_FILES[$champ]['error'] !== UPLOAD_ERR_OK) {
return "Erreur lors de l'envoi de l'image (code " . $_FILES[$champ]['error'] . ").";
}
if ($_FILES[$champ]['size'] > AVATAR_MAX_SIZE) {
return 'La photo dépasse la taille maximale autorisée (3 Mo).';
}
// getimagesize() décode réellement l'en-tête de l'image (contrairement à une simple
// vérification d'extension) : un fichier renommé en .jpg mais qui n'est pas une vraie
// image est rejeté ici, sans avoir besoin de l'extension GD
$infos = @getimagesize($_FILES[$champ]['tmp_name']);
if ($infos === false) {
return "Le fichier envoyé n'est pas une image valide.";
}
$largeur = $infos[0];
$hauteur = $infos[1];
$mime = $infos['mime'];
if (!in_array($mime, AVATAR_MIME_AUTORISES, true)) {
return 'Format non supporté : utilise une image JPEG, PNG ou WebP.';
}
if ($largeur > AVATAR_MAX_DIMENSION || $hauteur > AVATAR_MAX_DIMENSION) {
return 'Image trop grande (maximum ' . AVATAR_MAX_DIMENSION . ' pixels de côté).';
}
$contenu = file_get_contents($_FILES[$champ]['tmp_name']);
if ($contenu === false) {
return "Impossible de lire le fichier envoyé.";
}
return [
'mime' => $mime,
'data' => $contenu
];
}