libmagic / file에서 .docx 파일을 탐지하도록 만들기


17

다른 곳 에서 볼 수 있듯이 docx, xlsx 및 pttx는 ZIP입니다. 내 웹 응용 프로그램을 업로드 할 때 file(경유 libmagic및 것은 python-magic) ZIP 것으로이를 감지합니다.

파일의 내용을 데이터베이스에 blob으로 저장하지만 당연히 나는 어떤 종류의 파일 형식으로 사용자를 신뢰하고 싶지 않습니다. 따라서 file다운로드하는 동안 파일 이름 을 신뢰 하고 자동으로 생성하고 싶습니다 .

하나는 수정할 수 /etc/magic있지만 형식 ( magic(5))은 너무 복잡합니다. 데비안 버그에서이 문제에 대한 버그 보고서를 찾았 지만 2008 년 이후로 곧 수정되지 않는 것 같습니다.

내 유일한 다른 대안은 실제로 사용자를 신뢰하고 (여전히 내용을 blob으로 저장) 파일 이름을 기준으로 파일 확장자 만 확인하는 것입니다. 이렇게하면 일부 확장을 허용하지 않고 다른 확장을 허용 할 수 있습니다. 또한 사용자가 파일을 다시 다운로드하면 파일을 업로드 한 방식에 관계없이 파일을 가질 수 있습니다. 그러나 파일을 다른 사람과 공유하는 경우이 솔루션은 안전하지 않습니다. 파일 업로드 만 허용하면 파일 이름을 바꿀 수 있기 때문입니다.

어떤 아이디어?

마지막으로 docx 등의 마법 번호 목록을 찾았 지만 magic(5)형식으로 변환 할 수 없습니다 .

답변:


17

당신이 사용할 수있는

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

/ etc / magic에서 제공 한 정보를 기반으로 일반 파일 유형을 식별하십시오.

그러나 이것은 보편적이지 않을 수 PK\x03\x04\x00\x14\x08\x08있습니다. LibreOffice에서 생성 한 XLSX 파일의 시작 부분에서 관찰되었습니다.

이후 버전의 Ubuntu에서는 .docx, .pptx 및 .xlsx 파일을 올바르게 식별 할 수 있습니다. 파일 유틸리티에 대한 소스 코드를 파헤쳐 ~/file-5.09/magic/Magdir/msooxml서 식별을 수행하는 파일을 찾았습니다 . 당신은 할 수 있습니다 파일의 사본을 얻을 그것은 당신에 추가 /etc/magic파일.


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

그러나 후손을 위해 여기 V1.2를 남겨 두십시오.

파일 패키지가 업데이트되면 위의 링크로 여기에 사본을 포함 시키면 최신 버전이 아닐 수 있습니다.

#------------------------------------------------------------------------------
# $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
해당 파일 (msooxml)의 내용을 / etc / magic (debian)에 추가하고 작동했습니다.
Jay K

~/file-5.11/magic/Magdir/msooxml소스 를 사용하는 실수를했지만 사용 했던 일부 파워 포인트 예제 파일에서는 작동하지 않았습니다. 의 버전 file-5.17은 훌륭하게 작동합니다 (탭 또는 ... dunno와 관련이있을 수 있음).
dsummersl

FWIW, Scientific Linux 6에서 이것을 시도했지만 여전히 file5.04에 있으며 @ stanley-c가 언급했듯이 MIME 유형 태그를 64 자로 자릅니다 (그러나 경고합니다). 또한 Mac OS X Mavericks도 사용해 보았지만 규칙을 적용 할 수 없었습니다 (두 번째 규칙에서 [및.
jwadsack

"Microsoft OOXML"은 "Microsoft Word
2007+

4

5.13 이전 버전의 파일은 MIME 유형을 64 자로 자릅니다. 따라서 msooxml의 컨텐츠를 사용하여 file -bi 명령의 MIME 유형은 "mime application / vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary"가됩니다.


0

libreoffice의 docx를 사용하는 경우 / 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

이것을 시도했지만 이전에 잘못 감지 된 xlsx 파일이 제대로 감지되고 이전에 올바르게 감지 된 xlsx 파일이 더 이상 감지되지 않습니다.
Motin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.