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.
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
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”
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
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
~/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 wfile-5.17
działa jednak świetnie (może mieć coś wspólnego z kartami lub ... nie).file
5.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).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”
źródło
jeśli używasz docx libreoffice, możesz dodać zawartość (poniżej) do / etc / magic:
źródło