67 lines
2.7 KiB
PHP
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
|
|
];
|
|
}
|