.rar、.zipファイルMIMEタイプ


156

単純なphpアップロードスクリプトを開発しています。ユーザーがアップロードできるのは、ZIPファイルとRARファイルのみです。

チェックに使用すべきMIMEタイプは何$_FILES[x][type]ですか?(完全なリストをご覧ください)

ありがとうございました..



すべての圧縮ファイル(rar、zip、tar.gz、jarなど)のみを許可したいのですが、手順は何ですか?
リドゥヴァルシャン2017年

回答:


258

Freedompeace、KiyarashおよびSam Vloeberghsからの回答:

.rar    application/x-rar-compressed, application/octet-stream
.zip    application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip

ファイル名もチェックします。ファイルがRARファイルかZIPファイルかを確認する方法は次のとおりです。クイックコマンドラインアプリケーションを作成してテストしました。

<?php

if (isRarOrZip($argv[1])) {
    echo 'It is probably a RAR or ZIP file.';
} else {
    echo 'It is probably not a RAR or ZIP file.';
}

function isRarOrZip($file) {
    // get the first 7 bytes
    $bytes = file_get_contents($file, FALSE, NULL, 0, 7);
    $ext = strtolower(substr($file, - 4));

    // RAR magic number: Rar!\x1A\x07\x00
    // http://en.wikipedia.org/wiki/RAR
    if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
        return TRUE;
    }

    // ZIP magic number: none, though PK\003\004, PK\005\006 (empty archive), 
    // or PK\007\008 (spanned archive) are common.
    // http://en.wikipedia.org/wiki/ZIP_(file_format)
    if ($ext == '.zip' and substr($bytes, 0, 2) == 'PK') {
        return TRUE;
    }

    return FALSE;
}

100%確実ではありませんが、おそらく十分です。

$ rar.exe l somefile.zip
somefile.zip is not RAR archive

ただし、WinRARでも非RARファイルをSFXアーカイブとして検出します。

$ rar.exe l somefile.srr
SFX Volume somefile.srr

2
multipart / x-zipも.zipの有効な
MIMEタイプ

13
実際にジッパーのための別のMIMEタイプ、およびその者があります:application/x-zip-compressed
Kiyarash

これは、zipまたはrarファイルをまったく保証しません。WC3仕様によると、これは次のように解釈されます:application/zip| application/x-rar-compressedコンテンツタイプapplication/octet-stream
Wilt

1
.zipを含むMIMEタイプの便利
foundations

1
世界ではどのようにmultipart/x-zip有効なのでしょうか?マルチパートではありません。SitePointリストには、多くの不正確なMIMEタイプが含まれており、完全とはほど遠いものです。公式のIANA Media Typesレジストリは100%完全ではありません(そうなることもないでしょう)。
Suncat2000

35

アップロードの場合:

MIMEタイプの公式リストは、インターネット割り当て番号局(IANA)にあります。彼らのリストのContent-Typeヘッダーによるとzipですapplication/zip

rarファイルのメディアタイプはIANAに正式に登録されていませんが、一般的に使用されている非公式のMIMEタイプの値はapplication/x-rar-compressedです。

application/octet-stream:限りの手段「私はあなたにファイルストリームを送信し、このストリームの内容が指定されていない」(それができるというのは本当であるように、zipまたはrar同様のファイル)。サーバーは、ストリームの実際のコンテンツを検出することになっています。

注:アップロードでは、Content-Typeヘッダーに設定されているMIMEタイプに依存するのは安全ではありません。ヘッダーはクライアントで設定され、任意のランダムな値に設定できます。代わりに、phpファイル情報関数を使用して、サーバー上のファイルのMIMEタイプを検出できます。


ダウンロード:

zipファイルのみをダウンロードする場合は、1つのAcceptヘッダー値のみを設定する必要があります。追加の値セットは、サーバーがAccept要求されたMIMEタイプでヘッダーを満足できない場合のフォールバックとして使用されます。

WC3仕様によると、これは:

application/zip, application/octet-stream 

「私はMIMEタイプを好みますが、これを配信できない場合は(ファイルストリーム)も問題ありませんと解釈されます。application/zipapplication/octet-stream

したがって、単一のみ:

application/zip

zipファイルを保証します(406 - Not Acceptableサーバーが要求を満たせない場合の応答)。


5

信頼すべきではありません$_FILES['upfile']['mime']。MIMEタイプを自分で確認してください。そのために、PHP 5.3.0以降、デフォルトで有効になっているfileinfoextensionを使用できます。

  $fileInfo = new finfo(FILEINFO_MIME_TYPE);
  $fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']);
  $validMimes = array( 
    'zip' => 'application/zip',
    'rar' => 'application/x-rar',
  );

  $fileExt = array_search($fileMime, $validMimes, true);
  if($fileExt != 'zip' && $fileExt != 'rar')
    throw new RuntimeException('Invalid file format.');

注:で拡張機能を有効にし、php.iniサーバーを再起動することを忘れないでください。

extension=php_fileinfo.dll

0

リンクされ、質問、ファイルのURLのMIMEタイプを取得するための、いくつかのObjective-Cのコードがあります。MIMEタイプを取得するために、そのObjective-Cコードに基づいてSwift拡張機能を作成しました。

import Foundation
import MobileCoreServices

extension URL {
    var mimeType: String? {
        guard self.pathExtension.count != 0 else {
            return nil
        }

        let pathExtension = self.pathExtension as CFString
        if let preferredIdentifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil) {
            guard let mimeType = UTTypeCopyPreferredTagWithClass(preferredIdentifier.takeRetainedValue(), kUTTagClassMIMEType) else {
                return nil
            }
            return mimeType.takeRetainedValue() as String
        }

        return nil
    }
}

-2

拡張子には3文字以上の文字が含まれている可能性があるため、以下は拡張子の長さに関係なく、拡張子をテストします。

これを試して:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///

最後の「。」以降のすべての文字をチェックする

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.