Tạo libmagic / tệp phát hiện tệp .docx


17

Như đã thấy ở nơi khác , docx, xlsx và pttx là ZIP. Khi tải chúng lên ứng dụng web của tôi, file(thông qua libmagicpython-magic) phát hiện chúng là ZIP.

Tôi lưu trữ nội dung của tệp dưới dạng blob trong cơ sở dữ liệu, nhưng tự nhiên tôi không muốn tin tưởng người dùng với loại tệp này. Vì vậy, tôi muốn tin tưởng filevà tự động tạo một tên tệp trong khi tải xuống.

Tôi biết người ta có thể sửa đổi /etc/magicnhưng định dạng ( magic(5)) quá phức tạp đối với tôi. Tôi đã tìm thấy một báo cáo lỗi về vấn đề lỗi Debian nhưng vì nó từ năm 2008 nên nó dường như không được sửa chữa bất cứ lúc nào.

Tôi đoán thay thế duy nhất khác của tôi là thực sự tin tưởng người dùng (nhưng vẫn lưu trữ nội dung dưới dạng blob) và chỉ kiểm tra phần mở rộng tệp dựa trên tên tệp. Bằng cách này, tôi có thể không cho phép một số tiện ích mở rộng và cho phép các tiện ích khác. Và khi người dùng tải lại tệp của mình, anh ta có thể tải nó theo bất cứ cách nào anh ta tải lên. Nhưng giải pháp này không an toàn nếu tệp được chia sẻ với người khác, vì bạn có thể chỉ cần đổi tên tệp để cho phép tải lên.

Có ý kiến ​​gì không?

Cuối cùng, tôi đã tìm thấy một danh sách các số ma thuật cho docx , v.v. , nhưng tôi không thể chuyển đổi chúng thành magic(5)định dạng.

Câu trả lời:


17

Bạn có thể dùng

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

trong / etc / magic để xác định loại tệp chung dựa trên thông tin bạn cung cấp.

(Tuy nhiên, điều này có thể không phổ biến: PK\x03\x04\x00\x14\x08\x08đã được quan sát khi bắt đầu các tệp XLSX do LibreOffice tạo.)

Các phiên bản sau này của Ubuntu có thể xác định chính xác các tệp .docx, .pptx và .xlsx. Đi sâu vào mã sorce cho tiện ích tập tin Tôi tìm thấy ~/file-5.09/magic/Magdir/msooxmltập tin nhận dạng. Bạn có thể lấy một bản sao của tệp và thêm nó vào /etc/magictệp của bạn .


Bao gồm bản sao của tệp đã được cập nhật lên 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
---

Nhưng để lại V1.2 ở đây cho hậu thế.

Bao gồm một bản sao ở đây vì liên kết ở trên có thể bị lỗi thời vì gói tệp được cập nhật.

#------------------------------------------------------------------------------
# $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
Tôi đã thêm nội dung của tệp đó (msooxml) vào / etc / magic (trên debian) và nó đã hoạt động.
Jay K

Điều này cũng hiệu quả với tôi - mặc dù tôi đã phạm sai lầm khi sử dụng ~/file-5.11/magic/Magdir/msooxmlnguồn, nó không hoạt động đối với một số tệp ví dụ powerpoint tôi đang sử dụng. Phiên bản trong file-5.17hoạt động tuyệt vời mặc dù (có thể một cái gì đó để làm với các tab hoặc ... dunno).
DSummersl

FWIW, tôi đã thử cái này trên Science Linux 6 nhưng dường như vẫn còn trên file5.04, nó cắt ngắn loại thẻ MIME ở 64 ký tự (nhưng cảnh báo bạn về nó) như @ stanley-c đã đề cập. Tôi cũng đã dùng thử Mac OS X Mavericks, nhưng không thể áp dụng quy tắc này (mặc dù nó đã cảnh báo tôi về việc không cần phải thoát khỏi [và. Trong quy tắc thứ hai).
jwadsack

lưu ý rằng "Microsoft OOXML" cũng có thể là các tệp .docx, không chỉ "Microsoft Word
2007+

4

tệp, phiên bản trước 5.13, sẽ cắt loại MIME thành 64 ký tự. Vì vậy, bằng cách sử dụng nội dung của msooxml, loại MIME từ tệp -bi trở thành "ứng dụng mime / vnd.openxmlformats-offratedocument.word Processingml.d; charset = binary"


0

nếu sử dụng docx của libreoffice, bạn có thể thêm nội dung (bên dưới) vào / 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

Đã thử điều này, nhưng nó dẫn đến một số tệp xlsx được phát hiện không chính xác được phát hiện đúng, nhưng cũng có một số tệp xlsx được phát hiện chính xác không còn được phát hiện nữa
Motin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.