Faire en sorte que libmagic / file détecte les fichiers .docx

17

Comme vu ailleurs , docx, xlsx et pttx sont des ZIP. Lorsque vous les téléchargez sur mon application Web, file(via libmagicet python-magic) les détecte comme étant ZIP.

Je stocke le contenu du fichier en tant qu'objet blob dans la base de données, mais naturellement je ne veux pas faire confiance à l'utilisateur avec quel type de fichier il s'agit. Je voudrais donc faire confiance fileet générer automatiquement un nom de fichier lors du téléchargement.

Je sais que l'on peut modifier /etc/magicmais le format ( magic(5)) est beaucoup trop compliqué pour moi. J'ai trouvé un rapport de bogue sur le problème sur les bogues Debian mais comme c'est à partir de 2008, il ne semble pas être corrigé de sitôt.

Je suppose que ma seule autre alternative est de faire confiance à l'utilisateur (mais de toujours stocker le contenu en tant qu'objet blob) et de ne vérifier l'extension du fichier qu'en fonction du nom du fichier. De cette façon, je peux interdire certaines extensions et en autoriser d'autres. Et lorsque l'utilisateur retélécharge son fichier, il peut l'avoir de la manière dont il l'a téléchargée. Mais cette solution n'est pas sûre si le fichier est partagé avec d'autres, car vous pouvez simplement renommer le fichier pour permettre son téléchargement.

Des idées?

Enfin, j'ai trouvé une liste de nombres magiques pour docx, etc. , mais je ne peux pas les convertir au magic(5)format.

Jonatan Littke
la source

Réponses:

17

Vous pouvez utiliser

0       string  PK\x03\x04\x14\x00\x06\x00      Microsoft Office Open XML Format

dans / etc / magic pour identifier le type de fichier général en fonction des informations que vous avez fournies.

(Cependant, cela peut ne pas être universel: PK\x03\x04\x00\x14\x08\x08a été observé au début des fichiers XLSX générés par LibreOffice.)

Les versions ultérieures d'Ubuntu tentent d'identifier correctement les fichiers .docx, .pptx et .xlsx. En fouillant dans le code sorce pour l'utilitaire de fichier, j'ai trouvé le ~/file-5.09/magic/Magdir/msooxmlfichier qui fait l'identification. Vous pouvez obtenir une copie du fichier et l'ajouter à votre /etc/magicfichier.


Y compris copie du fichier mis à jour vers la version 1.5


# $File: msooxml,v 1.5 2014/08/05 07:38:45 christos Exp $
# msooxml:  file(1) magic for Microsoft Office XML
# From: Ralf Brown <[email protected]>

# .docx, .pptx, and .xlsx are XML plus other files inside a ZIP
#   archive.  The first member file is normally "[Content_Types].xml".
#   but some libreoffice generated files put this later. Perhaps skip
#   the "[Content_Types].xml" test?
# Since MSOOXML doesn't have anything like the uncompressed "mimetype"
#   file of ePub or OpenDocument, we'll have to scan for a filename
#   which can distinguish between the three types

# start by checking for ZIP local file header signature
0       string      PK\003\004
!:strength +10
# make sure the first file is correct
>0x1E       regex       \\[Content_Types\\]\\.xml|_rels/\\.rels
# skip to the second local file header
# since some documents include a 520-byte extra field following the file
# header, we need to scan for the next header
>>(18.l+49) search/2000 PK\003\004
# now skip to the *third* local file header; again, we need to scan due to a
# 520-byte extra field following the file header
>>>&26      search/1000 PK\003\004
# and check the subdirectory name to determine which type of OOXML
# file we have.  Correct the mimetype with the registered ones:
# http://technet.microsoft.com/en-us/library/cc179224.aspx
>>>>&26     string      word/       Microsoft Word 2007+
!:mime application/vnd.openxmlformats-officedocument.wordprocessingml.document
>>>>&26     string      ppt/        Microsoft PowerPoint 2007+
!:mime application/vnd.openxmlformats-officedocument.presentationml.presentation
>>>>&26     string      xl/     Microsoft Excel 2007+
!:mime application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
>>>>&26     default     x       Microsoft OOXML
---

Mais laisser V1.2 ici pour la postérité.

Inclure une copie ici car le lien ci-dessus peut devenir obsolète lorsque le package de fichiers est mis à jour.

#------------------------------------------------------------------------------
# $File: msooxml,v 1.2 2013/01/25 23:04:37 christos Exp $
# msooxml:  file(1) magic for Microsoft Office XML
# From: Ralf Brown <[email protected]>

# .docx, .pptx, and .xlsx are XML plus other files inside a ZIP
#   archive.  The first member file is normally "[Content_Types].xml".
# Since MSOOXML doesn't have anything like the uncompressed "mimetype"
#   file of ePub or OpenDocument, we'll have to scan for a filename
#   which can distinguish between the three types

# start by checking for ZIP local file header signature
0               string          PK\003\004
# make sure the first file is correct
>0x1E           string          [Content_Types].xml
# skip to the second local file header
#   since some documents include a 520-byte extra field following the file
#   header,  we need to scan for the next header
>>(18.l+49)     search/2000     PK\003\004
# now skip to the *third* local file header; again, we need to scan due to a
#   520-byte extra field following the file header
>>>&26          search/1000     PK\003\004
# and check the subdirectory name to determine which type of OOXML
#   file we have
#   Correct the mimetype with the registered ones:
#     http://technet.microsoft.com/en-us/library/cc179224.aspx
>>>>&26         string          word/           Microsoft Word 2007+
!:mime application/vnd.openxmlformats-officedocument.wordprocessingml.document
>>>>&26         string          ppt/            Microsoft PowerPoint 2007+
!:mime application/vnd.openxmlformats-officedocument.presentationml.presentation
>>>>&26         string          xl/             Microsoft Excel 2007+
!:mime application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
>>>>&26         default         x               Microsoft OOXML
!:strength +10
user9517
la source
1
J'ai ajouté le contenu de ce fichier (msooxml) à / etc / magic (sur debian) et cela a fonctionné.
Jay K
Cela a également fonctionné pour moi - même si j'ai fait l'erreur d'utiliser la ~/file-5.11/magic/Magdir/msooxmlsource, qui ne fonctionnait pas pour certains fichiers d'exemple PowerPoint que j'utilisais. La version file-5.17fonctionne très bien (peut-être quelque chose à voir avec les onglets ou ... ne sais pas).
dsummersl
FWIW, j'ai essayé cela sur Scientific Linux 6 mais c'est apparemment toujours sur file5.04, qui tronque la balise de type MIME à 64 caractères (mais vous en avertit) comme @ stanley-c l'a mentionné. J'ai également essayé Mac OS X Mavericks, mais je n'ai pas réussi à lui faire appliquer les règles (bien qu'il m'ait averti de ne pas avoir besoin d'échapper au [et. Dans la deuxième règle).
jwadsack
notez que "Microsoft OOXML" peut également être des fichiers .docx, pas seulement "Microsoft Word 2007+"
golimar
4

, version antérieure à 5.13, tronquera le type MIME à 64 caractères. Ainsi, en utilisant le contenu de msooxml, le type MIME du fichier -bi devient "mime application / vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary"

Stanley C.
la source
0

si vous utilisez le docx de libreoffice, vous pouvez ajouter du contenu (ci-dessous) à / etc / magic:

# start by checking for ZIP local file header signature
0               string          PK\003\004
!:strength +10
>1104           search/300      PK\003\004
# and check the subdirectory name to determine which type of OOXML
# file we have.  Correct the mimetype with the registered ones:
# http://technet.microsoft.com/en-us/library/cc179224.aspx
>>&26           string          word/           Microsoft Word 2007+
!:mime application/vnd.openxmlformats-officedocument.wordprocessingml.document
>>&26         string          ppt/            Microsoft PowerPoint 2007+
!:mime application/vnd.openxmlformats-officedocument.presentationml.presentation
>>&26         string          xl/             Microsoft Excel 2007+
!:mime application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
>>&26         default         x               Microsoft OOXML
Ford Guo
la source
J'ai essayé, mais cela a conduit à ce que certains fichiers xlsx précédemment détectés incorrectement soient correctement détectés, mais aussi à certains fichiers xlsx précédemment correctement détectés qui ne soient plus détectés
Motin