Question

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 ultérieurement. Lorsque les utilisateurs téléchargent des fichiers sur mon serveur, PHP me dit quel type de fichier est basé sur l'extension. Cependant, je crains que les utilisateurs ne puissent renommer un fichier zip somezipfile.png et le stocker, conservant ainsi un fichier zip sur mon serveur. Existe-t-il un moyen raisonnable d’ouvrir un fichier téléchargé et de "cocher"? pour voir s’il s’agit vraiment du type de filet susmentionné?

Était-ce utile?

La solution

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

Autres conseils

Découvrez l’ FileInfo extension PECL pour PHP, qui permet d'effectuer les opérations suivantes: Recherches magiques MIME pour vous.

En quelque sorte. Certains octets sont réservés dans la plupart des types de fichiers, ce qui vous évite de devoir compter sur l'extension. Le site http://wotsit.org est une excellente ressource pour trouver cela à propos d'un type particulier.

Si vous êtes sur un système Unix, je pense que la commande de fichier ne repose pas sur l'extension. Vous pouvez donc la récupérer si vous ne voulez pas écrire le code de contrôle d'octets.

Pour le format PNG ( http://www.w3.org/TR/PNG- Justification.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 1a 0a

(notation ASCII C) \ 211 P N G \ r \ n \ 032 \ n

Si vous n’utilisez que des images, alors getimagesize () doit distinguer une image valide d’une image fictive.

$ 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 valeur fausse de getimagesize n'est pas une image.

De nombreux types de fichiers ont " numéros magiques . au début du fichier pour les identifier, vous pouvez lire quelques octets situés au début du fichier et les comparer à une liste de nombres magiques connus.

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

Pour une réponse exacte sur la manière de procéder rapidement en PHP, consultez cette question: Comment trouver le type mime d'un fichier php?

En passant, j'ai rencontré un problème similaire dans lequel je devais faire ma propre vérification de type. L'interface frontale de mon application a été réalisée en flash. Les fichiers étaient transmis par flash à un script php. Lorsque j'essayais de faire une vérification de type MIME en utilisant php, le type toujours renvoyé était application / octetstream car il provenait de flash.

J'ai dû implémenter un paradigme de type nombres magiques. J'ai simplement créé un fichier XML contenant le type de fichier ainsi que certains modèles de définition trouvés au début du fichier. Une fois que le fichier a atteint le serveur, j’ai fait quelques correspondances avec le fichier xml, puis j’ai accepté ou rejeté le fichier. Je n'ai pas remarqué de baisse réelle des performances, ce à quoi je m'attendais.

Ceci est juste une note pour tous ceux qui peuvent utiliser Flash comme front-end et essayer de vérifier le fichier une fois qu'il est téléchargé.

En plus d’identifier le type de fichier, vous pouvez également vous méfier 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 la simple 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 masquage de données peut facilement être corrigé par charger et réenregistrer dans un nouveau fichier les données d’image réelles .. d’autres seront plus difficiles.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top