Membuat libmagic / file mendeteksi file .docx


17

Seperti yang terlihat di tempat lain , docx, xlsx dan pttx adalah ZIP. Saat mengunggahnya ke aplikasi web saya, file(via libmagicdan python-magic) mendeteksinya sebagai ZIP.

Saya menyimpan konten file sebagai gumpalan di database, tapi tentu saja saya tidak ingin mempercayai pengguna dengan jenis file apa ini. Jadi saya ingin mempercayai filedan secara otomatis menghasilkan nama file selama pengunduhan.

Saya tahu seseorang dapat memodifikasi /etc/magictetapi format ( magic(5)) terlalu rumit bagi saya. Saya menemukan laporan bug tentang masalah ini di bug Debian tetapi karena sejak 2008 sepertinya tidak diperbaiki dalam waktu dekat.

Saya kira satu-satunya alternatif saya adalah benar-benar mempercayai pengguna (tetapi masih menyimpan konten sebagai gumpalan) dan hanya memeriksa ekstensi file berdasarkan nama file. Dengan cara ini saya dapat melarang beberapa ekstensi dan mengizinkan yang lain. Dan ketika pengguna mengunduh ulang file-nya, ia dapat memilikinya dengan cara apa pun yang diunggahnya. Tetapi solusi ini tidak aman jika file tersebut dibagikan kepada orang lain, karena Anda dapat dengan mudah mengganti nama file untuk mengunggahnya.

Ada ide?

Terakhir, saya menemukan daftar angka ajaib untuk docx dll , tetapi saya tidak dapat mengubahnya menjadi magic(5)format.

Jawaban:


17

Kamu bisa memakai

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

di / etc / magic untuk mengidentifikasi tipe file umum berdasarkan informasi yang Anda berikan.

(Namun, ini mungkin tidak universal: PK\x03\x04\x00\x14\x08\x08telah diamati pada awal file XLSX yang dihasilkan LibreOffice.)

Versi Ubuntu selanjutnya dapat mengidentifikasi dengan benar file .docx, .pptx, dan .xlsx. Menggali kode sorce untuk utilitas file saya menemukan ~/file-5.09/magic/Magdir/msooxmlfile yang melakukan identifikasi. Anda bisa mendapatkan salinan file dan menambahkannya ke /etc/magicfile Anda .


Termasuk salinan file yang telah diperbarui ke 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
---

Tetapi meninggalkan V1.2 di sini untuk anak cucu.

Menyertakan salinan di sini sebagai tautan di atas dapat kedaluwarsa saat paket file diperbarui.

#------------------------------------------------------------------------------
# $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
Saya menambahkan konten file itu (msooxml) ke / etc / magic (di debian) dan berhasil.
Jay K

Ini bekerja untuk saya juga - walaupun saya membuat kesalahan dengan menggunakan ~/file-5.11/magic/Magdir/msooxmlsumbernya, yang tidak berfungsi untuk beberapa file contoh powerpoint yang saya gunakan. Versi dalam file-5.17karya-karya hebat (mungkin ada hubungannya dengan tab atau ... tidak tahu).
dsummersl

FWIW, saya mencoba ini di Scientific Linux 6 tapi ternyata masih di file5.04, yang memotong tag tipe MIME di 64 karakter (tapi memperingatkan Anda tentang hal itu) seperti @ stanley-c sebutkan. Saya juga mencoba Mac OS X Mavericks, tetapi tidak bisa menerapkannya (meskipun memperingatkan saya tentang tidak perlu melarikan diri dari [dan. Pada aturan kedua).
jwadsack

perhatikan bahwa "Microsoft OOXML" juga dapat berupa file .docx, bukan hanya "Microsoft Word 2007+"
golimar

4

file, versi sebelum 5.13, akan memotong tipe MIME menjadi 64 karakter. Jadi menggunakan konten msooxml, tipe MIME dari file -bi perintah menjadi "mime application / vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary"


0

jika menggunakan docx libreoffice , Anda dapat menambahkan konten (di bawah) ke / 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

Sudah mencoba ini, tetapi ini menyebabkan beberapa file xlsx yang sebelumnya tidak terdeteksi dengan benar terdeteksi, tetapi juga beberapa file xlsx yang sebelumnya terdeteksi dengan benar tidak terdeteksi lagi
Motin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.