web-dev-qa-db-fra.com

PHP vérifier si le fichier est une image

Existe-t-il un moyen de s’assurer que le fichier reçu est une image dans PHP?

Tester l’extension ne me semble pas très sûr car vous pouvez télécharger un script et changer son extension en tout ce que vous voulez.

J'ai aussi essayé d'utiliser getimagesize, mais il y a peut-être quelque chose de plus adapté à ce problème particulier.

42
sf89

Manière native d'obtenir le type MIME:

Pour PHP <5.3, utilisez mime_content_type ()
Pour PHP> = 5.3, utilisez finfo_open () ou mime_content_type ()

Les alternatives pour obtenir le MimeType sont exif_imagetype et getimagesize , mais elles reposent sur l’installation des bibliothèques appropriées. De plus, ils ne renverront probablement que des types d'image MIME, au lieu de la liste complète donnée dans magic.mime .

Tandis que mime_content_type est disponible à partir de PHP 4.3 et fait partie de l’extension FileInfo (activée par défaut depuis PHP 5.3, à l’exception des plates-formes Windows, où elle doit être activé manuellement, pour plus de détails voir ici ).

Si vous ne voulez pas vous soucier de ce qui est disponible sur votre système, enveloppez simplement les quatre fonctions dans une méthode proxy qui délègue l'appel de fonction à ce qui est disponible, par exemple.

function getMimeType($filename)
{
    $mimetype = false;
    if(function_exists('finfo_open')) {
        // open with FileInfo
    } elseif(function_exists('getimagesize')) {
        // open with Gd
    } elseif(function_exists('exif_imagetype')) {
       // open with EXIF
    } elseif(function_exists('mime_content_type')) {
       $mimetype = mime_content_type($filename);
    }
    return $mimetype;
}
21
Dead Man

getimagesize () devrait être le moyen le plus sûr de déterminer si le fichier est une image:

if(@is_array(getimagesize($mediapath))){
    $image = true;
} else {
    $image = false;
}

car il s'agit d'un exemple getimagesize () output:

Array (
[0] => 800
[1] => 450
[2] => 2
[3] => width="800" height="450"
[bits] => 8
[channels] => 3
[mime] => image/jpeg)
68
George Mickleburgh

L'utilisation de l'extension de fichier et de la fonction getimagesize pour détecter si le fichier téléchargé a le bon format est simplement la vérification au niveau de l'entrée. Elle peut simplement être ignorée en téléchargeant un fichier avec une extension vraie et un octet d'en-tête d'image, mais avec un contenu erroné.

pour être sûr et sécurisé, vous pouvez créer une vignette/redimensionner (même avec les tailles d’image originales) la photo téléchargée et enregistrer cette version à la place de celle téléchargée. Il est également possible d’obtenir le contenu du fichier téléchargé et de le rechercher pour un caractère spécial comme <?php pour trouver le fichier est une image ou non.

10
Sheen