単純なphpアップロードスクリプトを開発しています。ユーザーがアップロードできるのは、ZIPファイルとRARファイルのみです。
チェックに使用すべきMIMEタイプは何$_FILES[x][type]
ですか?(完全なリストをご覧ください)
ありがとうございました..
単純なphpアップロードスクリプトを開発しています。ユーザーがアップロードできるのは、ZIPファイルとRARファイルのみです。
チェックに使用すべきMIMEタイプは何$_FILES[x][type]
ですか?(完全なリストをご覧ください)
ありがとうございました..
回答:
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
application/x-zip-compressed
multipart/x-zip
有効なのでしょうか?マルチパートではありません。SitePointリストには、多くの不正確なMIMEタイプが含まれており、完全とはほど遠いものです。公式のIANA Media Typesレジストリは100%完全ではありません(そうなることもないでしょう)。
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/zip
application/octet-stream
したがって、単一のみ:
application/zip
zip
ファイルを保証します(406 - Not Acceptable
サーバーが要求を満たせない場合の応答)。
信頼すべきではありません$_FILES['upfile']['mime']
。MIMEタイプを自分で確認してください。そのために、PHP 5.3.0以降、デフォルトで有効になっているfileinfo
extensionを使用できます。
$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
リンクされ、質問、ファイルの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
}
}