Lässt libmagic / file .docx-Dateien erkennen

17

Wie an anderer Stelle zu sehen , sind docx, xlsx und pttx ZIPs. Wenn Sie sie in meine Webanwendung hochladen, erkennt file(über libmagicund python-magic), dass es sich um ZIP handelt.

Ich speichere den Inhalt der Datei als Blob in der Datenbank, möchte dem Benutzer aber natürlich nicht anvertrauen, um welchen Dateityp es sich handelt. Deshalb möchte ich filebeim Download darauf vertrauen und automatisch einen Dateinamen erzeugen.

Ich weiß, man kann es ändern, /etc/magicaber das Format ( magic(5)) ist mir viel zu kompliziert. Ich habe einen Fehlerbericht über das Problem bei Debian-Fehlern gefunden, aber seit 2008 scheint er nicht in Kürze behoben zu sein.

Ich denke, meine einzige andere Alternative ist, dem Benutzer zu vertrauen (aber den Inhalt trotzdem als Blob zu speichern) und die Dateierweiterung nur anhand des Dateinamens zu überprüfen. Auf diese Weise kann ich einige Erweiterungen nicht zulassen und andere zulassen. Und wenn der Benutzer seine Datei erneut herunterlädt, kann er sie auf die von ihm hochgeladene Weise haben. Diese Lösung ist jedoch unsicher, wenn die Datei mit anderen geteilt wird, da Sie die Datei einfach umbenennen können, um sie hochladen zu können.

Irgendwelche Ideen?

Zuletzt habe ich eine Liste mit magischen Zahlen für docx usw. gefunden , aber ich kann diese nicht in das magic(5)Format konvertieren.

Jonatan Littke
quelle

Antworten:

17

Sie können verwenden

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

in / etc / magic, um den allgemeinen Dateityp anhand der von Ihnen angegebenen Informationen zu identifizieren.

(Dies ist jedoch möglicherweise nicht universell: Dies wurde PK\x03\x04\x00\x14\x08\x08zu Beginn der von LibreOffice generierten XLSX-Dateien beobachtet.)

Spätere Versionen von Ubuntu versuchen, die .docx-, .pptx- und .xlsx-Dateien korrekt zu identifizieren. Beim Stöbern im Sorce-Code für das Dateidienstprogramm habe ich die ~/file-5.09/magic/Magdir/msooxmlDatei gefunden, die die Identifizierung vornimmt . Sie können eine Kopie der Datei erhalten und zu Ihrer /etc/magicDatei hinzufügen .


Einschließlich einer Kopie der Datei, die auf Version 1.5 aktualisiert wurde


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

Aber lassen Sie V1.2 hier für die Nachwelt.

Wenn Sie hier eine Kopie als obigen Link einfügen, ist das Dateipaket möglicherweise nicht mehr aktuell.

#------------------------------------------------------------------------------
# $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 unterstützt GoFundMonica
quelle
1
Ich habe den Inhalt dieser Datei (msooxml) zu / etc / magic (unter debian) hinzugefügt und es hat funktioniert.
Jay K
Das hat auch bei mir funktioniert - obwohl ich den Fehler gemacht habe, die ~/file-5.11/magic/Magdir/msooxmlQuelle zu verwenden, was bei einigen von mir verwendeten PowerPoint-Beispieldateien nicht funktioniert hat. Die Version in file-5.17funktioniert aber großartig (vielleicht etwas mit Tabs oder ... weiß nicht).
Dsummersl
FWIW, ich habe dies auf Scientific Linux 6 versucht, aber das ist anscheinend immer noch auf file5.04, was das MIME-Typ-Tag auf 64 Zeichen abschneidet (aber Sie warnt), wie @ stanley-c erwähnt. Ich habe auch Mac OS X Mavericks ausprobiert, konnte es aber nicht dazu bringen, die Regeln anzuwenden (obwohl es mich davor warnte, dass ich mich nicht der [und. In der zweiten Regel entziehen muss).
Jwadsack
Beachten Sie, dass "Microsoft OOXML" auch DOCX-Dateien sein kann, nicht nur "Microsoft Word 2007+"
Golimar
4

Datei, Version vor 5.13, schneidet den MIME-Typ auf 64 Zeichen ab. Wenn Sie also den Inhalt von msooxml verwenden, wird der MIME-Typ aus dem Befehl file -bi zu "mime application / vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary".

Stanley C.
quelle
0

Wenn Sie libreoffice's docx verwenden, können Sie Inhalt (unten) zu / etc / magic hinzufügen:

# 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
quelle
Versuchte dies, aber es führte dazu, dass einige zuvor falsch erkannte XLSX-Dateien ordnungsgemäß erkannt wurden, aber auch, dass einige zuvor richtig erkannte XLSX-Dateien nicht mehr erkannt wurden
Motin