2011-11-06 5 views
9

La vérification du type mime en php est assez facile mais pour autant que je sache, le mime peut être usurpé. L'attaquant peut télécharger un script PHP avec par exemple un type jpeg mime. Une chose qui vient à l'esprit est de vérifier l'extension de fichier du fichier téléchargé et assurez-vous qu'il correspond au type mime. Tout cela suppose que le répertoire de téléchargement est accessible par navigateur.MIME Type spoofing

Question: Existe-t-il d'autres techniques pour empêcher les "mauvais fichiers" d'entrer dans l'usurpation de type mime?

+2

Est-ce que votre question concerne l'usurpation de type mime ou voulez-vous simplement savoir comment valider les fichiers téléchargés pour vérifier s'ils sont des fichiers image? – CodeCaster

+0

En fait, vous ne devriez pas compter sur les types MIME et l'extension de fichier en premier lieu (et votre vérification, si mime-> extension, est également faux, si je fausse mime, je peux simuler encore plus facilement une extension de fichier correspondante) –

+0

@CodeCaster: Comment s'assurer que les fichiers que les types MIME des fichiers téléchargés ne sont pas usurpés? – abruski

Répondre

8

Réponse courte: Non

Deuxième réponse:

En comparant l'extension et en vous assurant qu'elle correspond au type MIME n'empêche pas vraiment quoi que ce soit. Comme il a été dit dans les commentaires, il est encore plus facile de modifier une extension de fichier. Le type MIME et l'extension ne sont que des indices, il n'y a pas de sécurité intrinsèque. Garantir que les fichiers entrants ne nuisent pas dépend beaucoup de ce que votre but pour eux va être. Dans votre cas, j'ai compris que vous attendez des images. Donc, ce que vous pourriez faire est d'effectuer quelques vérifications de santé mentale d'abord: balayer les premiers deux premiers octets pour voir si les fichiers contiennent les signatures d'en-tête d'image pertinentes - tous les formats d'image pertinents ont ceux-ci. Les "en-têtes de signature" vous aident à décider quel type de format d'image un fichier essaie d'usurper l'identité. Dans une prochaine étape, vous pouvez vérifier si le reste du contenu est compatible avec le format d'image sous-jacent. Cela vous garantit que le fichier est vraiment un fichier image de ce format spécifique. Mais même dans ce cas, le fichier pourrait être soigneusement créé de telle sorte que lorsque vous affichez l'image, une bibliothèque populaire utilisée pour afficher cette image (par exemple libpng etc.) se heurte à un débordement de buffer que l'attaquant a trouvé dans cette image. bibliothèque.Malheureusement, il n'y a aucun moyen de l'empêcher activement en plus de ne permettre aucune entrée du côté du client.

+0

Les images étaient seulement des exemples. Serait traiter des fichiers PDF. Mais je voulais généraliser la question de sorte qu'il serait utile avec d'autres types de fichiers aussi – abruski

+1

Le principe est toujours le même. Un attaquant intelligent vous donne ce que vous attendez, mais fabrique le fichier de manière à exploiter les bibliothèques les plus populaires utilisées pour afficher les fichiers. Pour le PDF cela signifierait qu'ils pourraient intégrer Javascript, vidéos, encore des images ... le nombre d'options augmente considérablement avec les fonctionnalités fournies par le format de données. Si vous (ou vos clients!) Ne "exécutez" jamais (le visionnement est "l'exécution", aussi) du contenu téléchargé, alors seulement vous êtes en sécurité. – emboss

+0

Il est possible d'obtenir une image "sûre" en la copiant dans une nouvelle image en utilisant une bibliothèque comme GD ou un outil comme ImageMagick. AFAIK, il n'y a aucun exploit ouvert connu pour aucune de ces bibliothèques - il y en avait autrefois dans le GDI de Windows mais cela a été corrigé depuis longtemps. Même s'il est vrai qu'en théorie, il n'y a pas de sécurité, il existe des façons de traiter les dossiers de façon sécuritaire. –

-4

Vérifiez l'extension.

<?php 

$okFiles = array('jpg', 'png', 'gif'); 

$pathInfo = pathinfo($filename); 

if(in_array($pathInfo['extension'], $okFiles)) { 
    //Upload 
} 
else { 
    //Error 
} 

?> 

Vous pouvez aussi - comme vous avez dit - vérifier si l'extension correspond au type MIME, mais il est beaucoup plus facile de vérifier que l'extension.

Pourquoi ce type de MIME vous intéresse?

+0

pour vous assurer que le fichier téléchargé est ce qu'il semble être. Imaginez: Téléchargez l'image MIME mais avec le code ext php et php à l'intérieur; le répertoire de téléchargement est accessible par navigateur et j'imagine que l'attaquant pourrait librement exécuter du code malveillant. – abruski

+1

@abruski Vous n'avez donc pas du tout besoin de vérifier le type MIME. Vérifiez simplement l'extension. Si c'est jpg/png/gif c'est bon, sinon jette une erreur "Just jpg/png/gif". Ne sachez pas si c'est ce dont vous avez peur, mais si l'extension est .jpg et le MIME sais PHP il sera toujours traité comme une image lorsque vous naviguez vers le fichier. – Sawny

+0

Considéré également que. J'essaie juste de m'assurer que je suis sur la bonne voie. – abruski

4

En cas d'Images

  • Vérifiez l'extension avec une liste de celles autorisées (ex. ".jpg", ".jpeg", ".png")
  • Vérifiez le fichier téléchargé par lui-même en cours d'exécution getimagesize, il retournera FALSE si ce n'est pas une image.

Autres types de téléchargement

  • Vérifiez les extensions autorisés (ex. ".pdf")
  • Vérifiez que le type MIME du fichier correspond à l'extension

échantillon code:

function getRealMimeType($filename) { 
    $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
    if (!$finfo) { 
     echo "Opening fileinfo database failed"; 
     return ""; 
    } 
    return $finfo->file($filename); 
} 

Voir finfo_file documentation.

+0

Il ne doit pas être une image, ce peut être n'importe quel type de fichier. – abruski

+0

Je vois, permettez-moi d'élargir la réponse alors. – stivlo

+0

c'est génial si getimagesize renvoie false si ce n'est pas une image :-) très utile pour vérifier l'ID deviner mais que faire si l'extension est usurpée et le type mime aussi? –