Hacer que libmagic / file detecte archivos .docx

17

Como se ve en otra parte , docx, xlsx y pttx son ZIP. Al subirlos a mi aplicación web, file(a través de libmagicy python-magic) los detecta como ZIP.

Guardo el contenido del archivo como un blob en la base de datos, pero, naturalmente, no quiero confiarle al usuario qué tipo de archivo es este. Por lo tanto, me gustaría confiar filey generar automáticamente un nombre de archivo durante la descarga.

Sé que uno puede modificar, /etc/magicpero el formato ( magic(5)) es demasiado complicado para mí. Encontré un informe de error sobre el problema en Debian, pero como es de 2008, no parece que se solucione pronto.

Supongo que mi única otra alternativa es confiar en el usuario (pero aún así almacenar el contenido como un blob) y solo verificar la extensión del archivo en función del nombre del archivo. De esta manera, puedo rechazar algunas extensiones y permitir otras. Y cuando el usuario vuelve a descargar su archivo, puede tenerlo de cualquier manera que lo haya subido. Pero esta solución es insegura si el archivo se comparte con otros, ya que simplemente puede cambiar el nombre del archivo para permitir cargarlo.

¿Algunas ideas?

Por último, encontré una lista de números mágicos para docx , etc. , pero no puedo convertirlos al magic(5)formato.

Jonatan Littke
fuente

Respuestas:

17

Puedes usar

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

en / etc / magic para identificar el tipo de archivo general en función de la información que proporcionó.

(Sin embargo, esto podría no ser universal: PK\x03\x04\x00\x14\x08\x08se ha observado al comienzo de los archivos XLSX generados por LibreOffice).

Las versiones posteriores de Ubuntu intentan identificar correctamente los archivos .docx, .pptx y .xlsx. Excavando en el código sorce para la utilidad de archivo, encontré el ~/file-5.09/magic/Magdir/msooxmlarchivo que hace la identificación. Puede obtener una copia del archivo y agregarlo a su /etc/magicarchivo.


Incluyendo copia del archivo que se ha actualizado a 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 <[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
---

Pero dejando V1.2 aquí para la posteridad.

Incluir una copia aquí como el enlace anterior puede quedar desactualizado a medida que se actualiza el paquete de archivos.

#------------------------------------------------------------------------------
# $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
usuario9517
fuente
1
Agregué el contenido de ese archivo (msooxml) a / etc / magic (en debian) y funcionó.
Jay K
Esto también funcionó para mí, aunque cometí el error de usar la ~/file-5.11/magic/Magdir/msooxmlfuente, que no funcionó para algunos archivos de ejemplo de PowerPoint que estaba usando. Sin file-5.17embargo, la versión funciona muy bien (tal vez algo que ver con pestañas o ... no sé).
dsummersl
FWIW, probé esto en Scientific Linux 6 pero aparentemente todavía está en file5.04, que trunca la etiqueta de tipo MIME a 64 caracteres (pero te advierte) como mencionó @ stanley-c. También probé Mac OS X Mavericks, pero no pude hacer que aplicara las reglas (aunque me advirtió sobre la necesidad de escapar de [y. En la segunda regla).
jwadsack
tenga en cuenta que "Microsoft OOXML" también puede ser archivos .docx, no solo "Microsoft Word 2007+"
golimar
4

archivo, versión anterior a 5.13, truncará el tipo MIME a 64 caracteres. Entonces, utilizando el contenido de msooxml, el tipo MIME del archivo -bi se convierte en "mime application / vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary"

Stanley C.
fuente
0

si usa docx de libreoffice, puede agregar contenido (a continuación) 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
Ford Guo
fuente
Intentado esto, pero conduce a algunos xlsx-archivos previamente detectados incorrectamente ser detectado correctamente, pero también a algunos xlsx-archivos previamente detectados correctamente no ser detectado por más tiempo
Motín