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


Comme vu ailleurs, docx, xlsx et pttx sont des fichiers ZIP. Lors de leur téléchargement sur mon application Web, file (via libmagic etpython-magic) les détecte comme étant ZIP.

Je stocke le contenu du fichier sous forme de blob dans la base de données, mais naturellement, je ne veux pas confier à l'utilisateur le type de fichier correspondant. Alors j'aimerais faire confiance file pour et générer automatiquement un nom de fichier lors du téléchargement.

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

Je suppose que ma seule autre alternative est de faire confiance à l'utilisateur (tout en conservant le contenu sous forme de blob) et de ne vérifier que l'extension du fichier en fonction du nom du fichier. De cette façon, je peux interdire certaines extensions et en autoriser d'autres. Et lorsque l'utilisateur re-télécharge son fichier, il peut l'avoir de la manière qu'il a téléchargée. Mais cette solution n'est pas sécurisée 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 parviens pas à les convertir en magic(5) format.


17
2017-12-06 11:11


origine




Réponses:


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 pourrait ne pas être universel: PK\x03\x04\x00\x14\x08\x08 a été observé au début des fichiers XLSX générés par LibreOffice.)

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


Y compris la copie du fichier qui a été 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 <ralf.brown@gmail.com>

# .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 la V1.2 ici pour la postérité.

Y compris une copie ici comme lien ci-dessus peut devenir obsolète que le paquet 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 <ralf.brown@gmail.com>

# .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

17
2018-04-09 10:12



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 - bien que j’ai commis l’erreur d’utiliser le ~/file-5.11/magic/Magdir/msooxml source, ce qui ne fonctionnait pas pour certains exemples de fichiers PowerPoint que j'utilisais. La version en file-5.17 fonctionne très bien cependant (peut-être quelque chose à voir avec des onglets ou ... ne sais pas). - dsummersl
FWIW, j’ai essayé cela sur Scientific Linux 6 mais c’est apparemment toujours sur file 5.04, qui tronque la balise de type MIME à 64 caractères (mais vous en avertit) comme @ stanley-c mentionné. J'ai aussi essayé Mac OS X Mavericks, mais je ne pouvais pas le faire appliquer les règles (bien qu'il m'avertisse de ne pas avoir besoin d'échapper à la [et. De la deuxième règle). - jwadsack


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


4
2018-05-16 21:33





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

0
2018-02-24 06:41



J'ai essayé, mais cela a conduit à la détection correcte de certains fichiers xlsx précédemment détectés de manière incorrecte, mais également à la non-détection de certains fichiers xlsx précédemment correctement détectés. - Motin