web-dev-qa-db-ja.com

libmagic / fileに.docxファイルを検出させる

他で見られるように 、docx、xlsx、pttxはZIPです。それらを私のWebアプリケーションにアップロードすると、filelibmagicおよび_python-magic_を介して)はそれらをZipとして検出します。

ファイルの内容をblobとしてデータベースに保存しますが、これがどのような種類のファイルであるかをユーザーに信頼したくないのは当然です。ですから、fileを信頼して、ダウンロード中にファイル名を自動的に生成したいと思います。

_/etc/magic_を変更できることはわかっていますが、形式(magic(5))は複雑すぎます。私は Debianバグの問題に関するバグレポート を見つけましたが、2008年からなので、すぐには修正されないようです。

私の他の唯一の選択肢は、確かにユーザーを信頼し(ただし、コンテンツをblobとして保存します)、ファイル名に基づいてファイル拡張子のみを確認することです。このようにして、一部の拡張を禁止し、他を許可することができます。ユーザーが自分のファイルを再ダウンロードすると、アップロードした方法でファイルを入手できます。ただし、ファイルを他のユーザーと共有している場合、ファイルの名前を変更するだけでアップロードできるため、このソリューションは安全ではありません。

何か案は?

最後に、 docxなどのマジックナンバーのリスト を見つけましたが、これらをmagic(5)形式に変換できません。

17
Jonatan Littke

使用できます

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

しかし、後世のために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 <[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
18
user9517

5.13より前のバージョンのファイルは、MIMEタイプを64文字に切り捨てます。したがって、msooxmlのコンテンツを使用すると、file -biコマンドからのMIMEタイプは「mime application/vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary」になります。

4
Stanley C.

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
0
Ford Guo