dev/lib/FileValidator.php

102 lines
2.8 KiB
PHP

<?php
class FileValidator {
private $minSize = 0; // Pas de minimum
private $maxSize = 100 * 1024 * 1024; // 100 Mo maximum
private $allowedMimes = ['image/jpeg', 'image/png'];
private $allowedExts = ['jpg', 'jpeg', 'png'];
/**
* Valide un fichier uploadé
*/
public function validate($file, $maxSize = null) {
if ($maxSize === null) {
$maxSize = $this->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;
}
}