他で見られるように 、docx、xlsx、pttxはZIPです。それらを私のWebアプリケーションにアップロードすると、file
(libmagic
および_python-magic
_を介して)はそれらをZipとして検出します。
ファイルの内容をblobとしてデータベースに保存しますが、これがどのような種類のファイルであるかをユーザーに信頼したくないのは当然です。ですから、file
を信頼して、ダウンロード中にファイル名を自動的に生成したいと思います。
_/etc/magic
_を変更できることはわかっていますが、形式(magic(5)
)は複雑すぎます。私は Debianバグの問題に関するバグレポート を見つけましたが、2008年からなので、すぐには修正されないようです。
私の他の唯一の選択肢は、確かにユーザーを信頼し(ただし、コンテンツをblobとして保存します)、ファイル名に基づいてファイル拡張子のみを確認することです。このようにして、一部の拡張を禁止し、他を許可することができます。ユーザーが自分のファイルを再ダウンロードすると、アップロードした方法でファイルを入手できます。ただし、ファイルを他のユーザーと共有している場合、ファイルの名前を変更するだけでアップロードできるため、このソリューションは安全ではありません。
何か案は?
最後に、 docxなどのマジックナンバーのリスト を見つけましたが、これらをmagic(5)
形式に変換できません。
使用できます
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
5.13より前のバージョンのファイルは、MIMEタイプを64文字に切り捨てます。したがって、msooxmlのコンテンツを使用すると、file -biコマンドからのMIMEタイプは「mime application/vnd.openxmlformats-officedocument.wordprocessingml.d; charset = binary」になります。
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