Fare in modo che libmagic / file rilevi i file .docx


17

Come visto altrove , docx, xlsx e pttx sono ZIP. Quando li carichi sulla mia applicazione web, file(tramite libmagice python-magic) li rileva come ZIP.

Archivo il contenuto del file come un BLOB nel database, ma naturalmente non voglio fidarmi dell'utente di che tipo di file sia. Quindi vorrei fidarmi filee generare automaticamente un nome file durante il download.

So che si può modificare, /etc/magicma il formato ( magic(5)) è troppo complicato per me. Ho trovato una segnalazione di bug sul problema sui bug di Debian, ma dal 2008 non sembra essere risolto presto.

Immagino che la mia unica altra alternativa sia quella di fidarmi davvero dell'utente (ma conservare comunque il contenuto come un BLOB) e controllare solo l'estensione del file in base al nome del file. In questo modo posso impedire alcune estensioni e consentirne altre. E quando l'utente scarica nuovamente il suo file, può averlo in qualunque modo lo abbia caricato. Ma questa soluzione non è sicura se il file è condiviso con altri, poiché puoi semplicemente rinominare il file per consentirne il caricamento.

Qualche idea?

Infine, ho trovato un elenco di numeri magici per docx ecc. , Ma non riesco a convertirli nel magic(5)formato.

Risposte:


17

Puoi usare

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

in / etc / magic per identificare il tipo di file generale in base alle informazioni fornite.

(Tuttavia, questo potrebbe non essere universale: PK\x03\x04\x00\x14\x08\x08è stato osservato all'inizio dei file XLSX generati da LibreOffice.)

Le versioni successive di Ubuntu provano a identificare correttamente i file .docx, .pptx e .xlsx. Scavando nel codice sorce per l'utilità del file ho trovato il ~/file-5.09/magic/Magdir/msooxmlfile che fa l'identificazione. Puoi ottenere una copia del file e aggiungerlo al tuo /etc/magicfile.


Inclusa copia del file che è stato aggiornato alla v 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
---

Ma lasciando V1.2 qui per i posteri.

L'inclusione di una copia qui come link qui sopra può non essere aggiornata con l'aggiornamento del pacchetto di file.

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

1
Ho aggiunto il contenuto di quel file (msooxml) a / etc / magic (su debian) e ha funzionato.
Jay K,

Questo ha funzionato anche per me, anche se ho fatto l'errore di usare il ~/file-5.11/magic/Magdir/msooxmlsorgente, che non ha funzionato per alcuni file di esempio di powerpoint che stavo usando. La versione file-5.17funziona alla grande però (forse qualcosa a che fare con le schede o ... non so).
dsummersl

FWIW, l'ho provato su Scientific Linux 6 ma apparentemente è ancora su file5.04, che tronca il tag di tipo MIME a 64 caratteri (ma ti avverte) come menzionato da @ stanley-c. Ho anche provato Mac OS X Mavericks, ma non sono riuscito a farlo applicare le regole (anche se mi ha avvertito di non dover sfuggire al [e. Nella seconda regola).
jwadsack,

si noti che "Microsoft OOXML" può anche essere file .docx, non solo "Microsoft Word 2007+"
golimar

4

file, versione precedente alla 5.13, troncerà il tipo MIME a 64 caratteri. Quindi, usando il contenuto di msooxml, il tipo MIME dal comando file -bi diventa "mime application / vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary"


0

se usi il docx di libreoffice , puoi aggiungere contenuto (sotto) a / 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

Ho provato questo, ma ha portato a rilevare correttamente alcuni file xlsx precedentemente rilevati in modo errato, ma anche ad alcuni file xlsx precedentemente rilevati correttamente non sono stati più rilevati
Motin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.