2008-10-08 13 views
12

Je programme quelque chose qui permet aux utilisateurs de stocker des documents et des images sur un serveur web, pour les stocker et les récupérer plus tard. Lorsque les utilisateurs téléchargent des fichiers sur mon serveur, PHP me dit quel type de fichier est basé sur l'extension. Cependant, j'ai peur que les utilisateurs puissent renommer un fichier zip comme somezipfile.png et le stocker, gardant ainsi un fichier zip sur mon serveur. Existe-t-il un moyen raisonnable d'ouvrir un fichier téléchargé et de "vérifier" s'il est vraiment du type de fichier?Comment savoir si quelqu'un fait semblant d'un type de fichier? (PHP)

Répondre

18

Magic number. Si vous pouvez lire les premiers octets d'un fichier binaire, vous pouvez savoir de quel type de fichier il s'agit.

+0

Les nombres magiques ne sont pas toujours à le début. TGA, par exemple, les a à la fin, je crois. –

+0

sachez qu'en se basant sur cette vérification, les utilisateurs malveillants peuvent insérer des octets magiques, puis écrire du code PHP dans le même fichier pour essayer d'exécuter du code sur votre machine – Jorre

+1

Des exemples sur comment faire cela? – CMCDragonkai

4

Trier par. La plupart des types de fichiers ont des octets réservés pour les marquer de sorte que vous ne devez pas compter sur l'extension. Le site http://wotsit.org est une excellente ressource pour trouver cela pour un type particulier. Si vous êtes sur un système Unix, je crois que la commande de fichier ne dépend pas de l'extension, donc vous pouvez l'utiliser si vous ne voulez pas écrire le code de vérification des octets.

Pour PNG (http://www.w3.org/TR/PNG-Rationale.html)

Les huit premiers octets d'un fichier PNG contiennent toujours les valeurs suivantes:

(décimal) 137 80 78 71 13 10 26 10

(hexadécimal) 89 50 4E 47 0d 0a 0a 1a

(notation ASCII C) \ 211 PNG \ r \ n \ 032 \ n

2

De nombreux types de fichiers ont "magic numbers" au début du fichier pour les identifier. Vous pouvez lire quelques octets à partir du début du fichier et les comparer à une liste de nombres magiques connus.

1

Sur un système Unix, la capture de la sortie de la commande 'file' devrait fournir des informations adéquates.

8

Consultez l'extension PECL FileInfo pour PHP, qui peut effectuer les recherches magiques MIME pour vous.

2

Si vous ne traitez avec des images, puis getimagesize() doit distinguer une image valide d'un faux.

$ php -r 'var_dump(getimagesize("b&n.jpg"));' 
array(7) { 
    [0]=> 
    int(200) 
    [1]=> 
    int(200) 
    [2]=> 
    int(2) 
    [3]=> 
    string(24) "width="200" height="200"" 
    ["bits"]=> 
    int(8) 
    ["channels"]=> 
    int(3) 
    ["mime"]=> 
    string(10) "image/jpeg" 
} 

$ php -r 'var_dump(getimagesize("/etc/passwd"));' 
bool(false) 

Une fausse valeur de getimagesize n'est pas une image.

1

En note, j'ai rencontré un problème similaire où je devais faire ma propre vérification de type. L'interface frontale de mon application a été faite en flash. Les fichiers étaient transmis par flash à un script php. Quand j'essayais de faire une vérification de type MIME en utilisant php, le type toujours renvoyé était application/octetstream parce qu'il venait de flash.

J'ai dû implémenter un paradigme de type nombres magiques. J'ai simplement créé un fichier xml qui contenait le type de fichier avec quelques motifs de définition trouvés au début du fichier. Une fois que le fichier a atteint le serveur, j'ai fait une correspondance avec le fichier xml, puis j'ai accepté ou rejeté le fichier. Je n'ai pas remarqué de baisse de performance réelle, ce à quoi je m'attendais.

Ceci est juste une note de côté à toute personne qui utilise Flash comme front-end et en essayant de taper vérifier le fichier une fois qu'il est téléchargé.

+0

Quelle méthode avez-vous utilisée pour comparer les fichiers à votre référence? –

+0

Dans le fichier xml j'avais un attribut de la position où la chaîne magique peut être trouvée dans le fichier. J'ai donc lu dans le nombre spécifié d'octets du fichier et l'ai converti en hex et ai fait une comparaison. – JustLogic

1

En plus d'identifier le type de fichier, vous pouvez rechercher des fichiers avec d'autres fichiers incorporés ou ajoutés à ceux-ci. Cela nécessitera malheureusement une analyse plus approfondie du contenu du fichier que l'utilisation de "nombres magiques".

Par exemple, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (ce type particulier de dissimulation de données peut être facilement contourné en chargeant et resaving dans un nouveau fichier les données d'image réelles .. autres seront plus difficiles.)