102 lines
2.8 KiB
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;
|
|
}
|
|
} |