web-dev-qa-db-fra.com

Utilisez PHP pour vérifier le fichier image téléchargé pour les logiciels malveillants?

Je veux que mes utilisateurs puissent télécharger une photo. Actuellement, je ne vérifie pas la photo téléchargée pour des problèmes de quelque nature que ce soit, bien que je limite la taille à 32k. Y a-t-il un moyen pour moi de vérifier les fichiers image téléchargés pour les logiciels malveillants? Par exemple, existe-t-il un serveur qui exécute Clamav que je peux accéder à PHP? Merci.

2
Frank E
9
D.W.

Je pense que la meilleure approche serait d'utiliser une solution combinée:

  • Scannez le fichier à l'aide d'un antivirus
  • Vérifiez le type MIME du fichier
  • Effectuer la taille du fichier Vérifiez que Cristi décrit ici
  • Chargez le fichier téléchargé dans une bibliothèque d'images et enregistrez-la à nouveau (vous pouvez déjà le faire si vous redimensionnez les images)

En utilisant tous ces chèques, la possibilité d'une attaque réussie serait beaucoup plus petite.

2
Dinu

Une pratique bonne et populaire est de vérifier si l'image téléchargée est vraiment une image et non autre chose. Validation d'une image est plus sécurisée que la numérisation avec un antivirus .

Le getImagesize () La fonction déterminera la taille d'un fichier image donné et renvoyera les dimensions avec le type de fichier et une chaîne de texte de hauteur/largeur à utiliser dans une balise HTML img normale et le Type de contenu HTTP correspondant. La fonction prend en charge de nombreux formats d'image.

Vous pouvez utiliser getimagesize() pour accomplir plusieurs choses à la fois:

  • Valider que le fichier est une image
  • Autoriser uniquement certains types d'image
  • Autoriser uniquement les tailles souhaitées
  • Détermine le MIME type de l'image qui peut être utilisée pour livrer des images avec le bon HTTP Content-type entête

    function is_image($path)
        {
        $a = getimagesize($path);
        $image_type = $a[2];
    
        if (in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
        {
            return true;
        }
        return false;
    }
    
  • $array[0] et $array[1] sont la largeur et la hauteur de l'image.

  • $array[2] a le type d'image.

Notez que les vidéos MPEG sont détectées comme IMAGETYPE_ICO.

1
Cristian Dobre

Comme le dit Christian, c'est-à-dire que la meilleure solution consiste à blanchir et à vérifier le type de fichier - toutefois tout fichier qui comporte des métadonnées non compressées peut potentiellement être un Avenue pour attaquer un serveur Web . Dresser les métadonnées.

Invoquant le vérificateur de virus de manière synchrone de la demande Web est une très mauvaise idée en termes de performance, de stabilité et de disponibilité. Tandis que le gestionnaire de téléchargement par défaut dans PHP met sensiblement des fichiers à l'écart de la manière et vous oblige à les déplacer avant la fin de la demande - cela signifie que vous devez copier le fichier une fois de plus après votre virus analysez-le.

1
symcbean

Pas une réponse complète * mais une façon de filtrer le contenu indésirable consisterait à utiliser les fonctions de manipulation d'images de PHP pour transposer l'image téléchargée en une nouvelle image, puis enregistrez cela plutôt que les données téléchargées. Un peu comme prendre une capture d'écran d'une image plutôt que de sauver la photo directement.

* = Ou la meilleure solution, ou plus facile ...

1
John U