J'ai eu cette question pendant un moment: comment est exactement le type MIME d'un fichier déterminé? Je crois que cela se fait en vérifiant si des octets spécifiques du fichier contiennent n'importe lequel des numéros magiques < / a> / signatures de fichier , droite? P>
Si tel est le cas, cela pose une autre question, disons que je télécharge un script Bash avec une fausse signature de fichier GIF sur un site Web qui permet uniquement aux images d'être téléchargées, ce qui va se passer? Soit: p>
image / gif code> est renvoyé à tort comme le mimeType et le téléchargement est autorisé à continuer li>
ol>
Je n'ai pas d'éditeur hexagonal installé ATM, et je n'aime pas former des conclusions liées à la sécurité des tests, car je me manquerai (ou mal interpréter) quelque chose, alors ma question est la suivante: laquelle des options ci-dessus est correct? p>
Aussi, y a-t-il d'autres meilleures pratiques (en plus de vérifier le MIMETYPE) pour vous assurer que tout fichier donné est en fait ce qu'il semble / a besoin (ou est autorisé) d'être? Merci d'avance. P>
PS: strong> juste pour être clair, je ne vous demande pas sur le type type code> dans les fichiers $ _ code> superglobal. P>
3 Réponses :
Ma compréhension est que cela (types MIME vulnérables) est la raison pour laquelle le nom du fichier doit être crypté par divers moyens lorsqu'ils sont téléchargés, puis stockés dans une base de données à récupérer via des numéros d'identification. Fondamentalement, quelqu'un doit-il réussir à télécharger un script malveillant, ils ne pourront jamais le trouver pour l'exécuter? P>
Mais le stockage sur une base de données ou CDN n'est pas toujours une option. Obscurcir le nom de fichier ne peut pas être considéré comme sécurisé et a pour effet de perdre des données sémantiques éventuellement précieuses (nom de fichier lui-même). Je suis au courant des options d'architecture et des précautions, mais ma question est principalement orientée vers la détection de type MIME (fausse?) Et des alternatives possibles.
Ma compréhension concerne les routines de détermination MIME du code de téléchargement de fichier sont extrêmement brutes et que le type MIME dans le tableau $ _files ne peut tout simplement pas être fait confiance. Cela a été mon expérience que c'est facilement rollé. p>
Vous ferez mieux d'utiliser la bibliothèque FileInfo, qui fournit une détection de type de fichier plus robuste. p>
Le type type code> Index dans
$ _ Fichiers code> provient du navigateur / utilisateur, il ne peut pas être fait confiance. J'utilise FILEInfo (ou similaire), mais la question s'applique toujours: si le mime est simulé, est-ce que FileInfo est suffisamment intelligent pour détecter cela?
En ce qui concerne ce que je comprends à partir de la documentation, FileInfo regarde l'en-tête Plus fait certaines heuristiques pour détecter le fichier de fichiers et ne nécessite pas d'informations (ou de s'appuyer sur) des informations envoyées par le navigateur.
La page sur fichierInfo dans le manuel PHP indique que la détection de fichier n'est pas fiable à 100%. Je suppose que vous pouviez créer un fichier qui peut le tromper.
@Gordonm: connaissez-vous de toute méthode plus fiable que FILEInfo?
Je suppose que vous pouviez exécuter () un utilitaire externe tel que * ix fichier. Je pense que l'utilitaire de fichier fonctionne de la même manière que FILEInfo, en recherchant des octets magiques dans des fichiers. Mon soupçon est qu'il n'ya pas de moyen fiable de 100% de déterminer les types de fichiers. Après tout, vous pouvez ajouter un script PHP sur un fichier GIF et il ressemblerait toujours à un fichier GIF aux visionneuses d'images. Plutôt que d'essayer de trouver un moyen de garantir le type de fichier, vous ferez probablement mieux de trouver un moyen de sandboxer des fichiers téléchargés et de limiter ce qu'ils peuvent faire, tels que le tournage du moteur PHP pour le répertoire, ils sont téléchargés dans
Si vous parlez de Si vous êtes intéressé par la vérification des images, vous pouvez utiliser la fonction getImagesize pour déterminer le type de fichier. Cette fonction renvoie NULL pour les images qu'il ne peut pas comprendre. Même s'il renvoie un type d'image valide, vous pouvez toujours rejeter le fichier par exemple. Si vous attendez GIF et JPEG et que vous obtenez un tiff à la place. P>
En outre, un serveur Web déterminera s'il faut exécuter un fichier de ne pas dépendre des autorisations de fichier (le bit Execute et la ligne Shebang) et l'extension de fichier. Si vous gardez un chèque sur ces deux, vous êtes probablement bien. P> $ _ fichiers ['userfile'] ['Type'] code> alors ces informations sont envoyées par le navigateur. Il peut être ou peut ne pas être présent et même si son présent, vous devriez le traiter comme une autre entrée utilisateur. P>