Sprawienie, by libmagic / file wykrył pliki .docx

17

Jak widać gdzie indziej , docx, xlsx i pttx są plikami ZIP. Podczas przesyłania ich do mojej aplikacji internetowej file(przez libmagici python-magic) wykrywa je jako ZIP.

Przechowuję zawartość pliku jako obiekt blob w bazie danych, ale oczywiście nie chcę ufać użytkownikowi, jakiego rodzaju jest to typ pliku. Chciałbym więc zaufać filei automatycznie wygenerować nazwę pliku podczas pobierania.

Wiem, że można to zmienić, /etc/magicale format ( magic(5)) jest dla mnie zbyt skomplikowany. Znalazłem raport o błędzie dotyczący błędów w Debianie, ale ponieważ pochodzi z 2008 roku, wydaje się, że nie zostanie wkrótce naprawiony.

Wydaje mi się, że moją jedyną alternatywą jest zaufanie do użytkownika (ale nadal zapisywanie zawartości jako obiektu blob) i sprawdzanie tylko rozszerzenia pliku na podstawie nazwy pliku. W ten sposób mogę wyłączyć niektóre rozszerzenia i zezwolić na inne. A kiedy użytkownik ponownie pobierze swój plik, może go mieć w dowolny sposób, w jaki go załadował. Ale to rozwiązanie nie jest bezpieczne, jeśli plik jest udostępniany innym osobom, ponieważ można po prostu zmienić nazwę pliku, aby umożliwić przesłanie go.

Jakieś pomysły?

Wreszcie znalazłem listę magicznych liczb dla docx itp. , Ale nie jestem w stanie przekonwertować ich na magic(5)format.

Jonatan Littke
źródło

Odpowiedzi:

17

Możesz użyć

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

w / etc / magic, aby zidentyfikować ogólny typ pliku na podstawie dostarczonych informacji.

(Może to jednak nie być uniwersalne: PK\x03\x04\x00\x14\x08\x08zaobserwowano na początku plików XLSX generowanych przez LibreOffice.)

Późniejsze wersje Ubuntu wymagają prawidłowej identyfikacji plików .docx, .pptx i .xlsx. Przeszukując kod magii dla narzędzia do plików, znalazłem ~/file-5.09/magic/Magdir/msooxmlplik, który dokonuje identyfikacji. Możesz pobrać kopię pliku i dodać go do swojego /etc/magicpliku.


W tym kopia pliku, który został zaktualizowany do wersji 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
---

Ale pozostawiając tutaj wersję 1.2 dla potomności.

Uwzględnienie tutaj kopii jako powyższego łącza może być nieaktualne w miarę aktualizowania pakietu plików.

#------------------------------------------------------------------------------
# $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
użytkownik9517
źródło
1
Dodałem zawartość tego pliku (msooxml) do / etc / magic (w Debianie) i zadziałało.
Jay K
To również działało dla mnie - chociaż popełniłem błąd, używając ~/file-5.11/magic/Magdir/msooxmlźródła, co nie działało w przypadku niektórych przykładowych plików programu PowerPoint, których używałem. Wersja w file-5.17działa jednak świetnie (może mieć coś wspólnego z kartami lub ... nie).
dsummersl
FWIW, próbowałem tego na Scientific Linux 6, ale najwyraźniej nadal jest to file5.04, który obcina znacznik typu MIME przy 64 znakach (ale ostrzega o tym), jak wspomniano @ stanley-c. Próbowałem także Mac OS X Mavericks, ale nie mogłem zmusić go do zastosowania reguł (chociaż ostrzegało mnie to przed koniecznością ucieczki przed [i. W drugiej regule).
jwadsack
zauważ, że „Microsoft OOXML” może być również plikiem .docx, nie tylko „Microsoft Word 2007+”
golimar
4

plik, wersja wcześniejsza niż 5.13, skróci typ MIME do 64 znaków. Zatem używając zawartości msooxml, typ MIME z polecenia file -bi zmienia się w „mime application / vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary”

Stanley C.
źródło
0

jeśli używasz docx libreoffice, możesz dodać zawartość (poniżej) do / 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
źródło
Próbowałem tego, ale doprowadziło to do prawidłowego wykrycia niektórych wcześniej nieprawidłowo wykrytych plików xlsx, ale również do wykrycia niektórych wcześniej poprawnie wykrytych plików xlsx
Motin