44 votes

Comment vérifier le type de fichier téléchargé en PHP

J'ai utilisé ce code pour vérifier le type d'images,

$f_type=$_FILES['fupload']['type'];

if ($f_type== "image/gif" OR $f_type== "image/png" OR $f_type== "image/jpeg" OR $f_type== "image/JPEG" OR $f_type== "image/PNG" OR $f_type== "image/GIF")
{
    $error=False;
}
else
{
    $error=True;
}

mais certains utilisateurs se plaignent de recevoir une erreur lors du téléchargement de tout type d'images, alors que d'autres ne reçoivent aucune erreur !

Je me demandais si cela réglait le problème :

if (mime_content_type($_FILES['fupload']['type']) == "image/gif"){...

Des commentaires ?

96voto

deceze Points 200115

Ne jamais utiliser $_FILES..['type'] . Les informations qu'il contient ne sont pas du tout vérifiées, il s'agit d'une valeur définie par l'utilisateur. Testez vous-même le type. Pour les images, exif_imagetype est généralement un bon choix :

$allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
$detectedType = exif_imagetype($_FILES['fupload']['tmp_name']);
$error = !in_array($detectedType, $allowedTypes);

Alternativement, le finfo fonctions sont excellentes, si votre serveur les prend en charge.

9voto

feeela Points 9901

En plus de @deceze, vous pouvez également finfo() pour vérifier le type MIME des fichiers non-image :

$finfo = new finfo();
$fileMimeType = $finfo->file($path . $filename, FILEINFO_MIME_TYPE);

4voto

Violence Points 188

Bien sûr, vous pouvez vérifier si c'est une image avec exif, mais une meilleure façon je pense est de faire avec finfo comme ceci :

$allowed_types = array ( 'application/pdf', 'image/jpeg', 'image/png' );
$fileInfo = finfo_open(FILEINFO_MIME_TYPE);
$detected_type = finfo_file( $fileInfo, $_FILES['datei']['tmp_name'] );
if ( !in_array($detected_type, $allowed_types) ) {
    die ( 'Please upload a pdf or an image ' );
}
finfo_close( $fileInfo );

4voto

Picard Points 1456

Le meilleur moyen, à mon avis, est d'abord d'utiliser getimagesize() suivi par imagecreatefromstring() .

    $size = getimagesize($filename);
    if ($size === false) {
        throw new Exception("{$filename}: Invalid image.");
    }
    if ($size[0] > 2500 || $size[1] > 2500) {
        throw new Exception("{$filename}: Image too large.");
    }

    if (!$img = @imagecreatefromstring(file_get_contents($filename))) {
        throw new Exception("{$filename}: Invalid image content.");
    }

Vérification par getimagesize() empêche certaines attaques DoS, parce que nous n'avons pas à essayer de imagecreatefromstring() à partir de chaque fichier fourni par l'utilisateur, qu'il s'agisse d'un fichier non-image ou d'un fichier trop grand. Malheureusement, selon Documents PHP ne peut pas être utilisé pour vérifier le contenu du type d'image.

El imagecreatefromstring() essaie enfin d'ouvrir le fichier en tant qu'image - si cela réussit - nous avons une image.

2voto

Salvi Pascual Points 116

Il s'agit d'un simple script d'une ligne que j'utilise souvent.

$image = "/var/www/Core/temp/image.jpg";
$isImage = explode("/", mime_content_type())[0] == "image";

En gros, j'utilise mime_content_type() pour obtenir quelque chose comme "image/jpg", puis je l'explose par "/" et je vérifie le premier élément du tableau pour voir s'il contient "image".

J'espère que ça marchera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X