HttpPostedFile.ContentType est-il un moyen sans faille de valider un fichier téléchargé?

Je souhaite valider le type de fichier pour m’assurer que l’utilisateur télécharge une image de type JPEG, GIF ou PNG. Au lieu de vérifier l’extension du fichier, j’ai pensé que l’utilisation de HttpPostedFile.ContentType serait plus sûre car elle vérifie le type de contenu MIME.

protected void cvValidateImageType_ServerValidate(object source, ServerValidateEventArgs args) { if (fupImage.HasFile) { args.IsValid = (fupImage.PostedFile.ContentType.ToLower() == "image/jpg" || fupImage.PostedFile.ContentType.ToLower() == "image/jpeg" || fupImage.PostedFile.ContentType.ToLower() == "image/pjpeg" || fupImage.PostedFile.ContentType.ToLower() == "image/gif" || fupImage.PostedFile.ContentType.ToLower() == "image/x-png" || fupImage.PostedFile.ContentType.ToLower() == "image/png"); } else args.IsValid = true; } 

Est-ce un moyen sans faille de vérifier le type de fichier ou peut-il être dupé?

L’utilisation de l’extension est probablement plus sûre. Le ContentType est envoyé dans la requête http du client. Si vous testez l’extension, l’utilisateur peut modifier l’extension d’un fichier exe en jpg, mais il ne s’exécutera pas comme un fichier exe.

L’utilisation de l’extension et des en-têtes HTTP sont également peu fiables, car ils peuvent être simulés facilement, soit par un attaquant malveillant utilisant des requêtes HTTP brutes, soit par un navigateur innocent choisissant un fichier portant un nom incorrect. Si vous voulez être certain, vous devez ouvrir le fichier et parsingr le contenu, il n’y a pas d’autre moyen.

Pour connaître le type de contenu de manière fiable, vous pouvez envisager de rechercher un type de contenu, par exemple:

http://suika.fam.cx/www/markup/html/whatpm/Whatpm/ContentType.html

Cela tente de déterminer le type de contenu du fichier en examinant les premiers octets.