.rar, .zip 파일 MIME 유형


156

간단한 PHP 업로드 스크립트를 개발 중이며 사용자는 ZIP 및 RAR 파일 만 업로드 할 수 있습니다.

어떤 MIME 형식을 확인해야 $_FILES[x][type]합니까? (전체 목록을 참조하십시오)

감사합니다..



모든 압축 파일 (rar, zip, tar.gz, jar 등) 만 허용하고 싶습니다. 절차는 무엇입니까?
Ridhuvarshan 2016 년

답변:


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 형식입니다 (PKZIP 아카이브)
Sam Vloeberghs

13
실제로 우편 번호에 대한 또 다른 MIME 유형이 있으며, 다음과 같습니다.application/x-zip-compressed
Kiyarash

이것은 당신에게 zip또는 rar파일을 전혀 보장하지 않습니다 . 에 따르면 WC3 사양 이로 intrepreted 될 것입니다 : "내가 좋아 application/zip| application/x-rar-compressed콘텐츠 형식을하지만,이 제공 할 수없는 경우 application/octet-stream(파일 스트림은) 좋은 또한".
Wilt April

1
다음은 .zip이 포함 된 유용한 MIME 유형 목록입니다. sitepoint.com/web-foundations/mime-types-complete-list
sstauross

1
세계에서 어떻게 multipart/x-zip유효 할 수 있습니까? 여러 부분이 아닙니다. SitePoint 목록에 부정확 한 MIME 유형이 많이 있으며 완전하지 않습니다. 공식 IANA Media Types 레지스트리 는 100 % 완료되지 않았습니다.
Suncat2000 2016 년

35

업로드 :

MIME 형식의 공식 목록은 IANA (Internet Assigned Numbers Authority) 에서 찾을 수 있습니다 . 에 대한 목록 Content-Type헤더에 따르면 zip입니다 application/zip.

rar파일 의 미디어 유형 은 공식적으로 IANA에 등록되어 있지 않지만 비공식적으로 일반적으로 사용되는 MIME 유형 값은 application/x-rar-compressed입니다.

application/octet-stream수단만큼 : "나는 당신에게 파일 스트림 및 지정되지 않은 스트림의 내용을 보내" (이 될 수 있다는 사실 때문에 ziprar뿐만 아니라 파일). 서버는 스트림의 실제 내용이 무엇인지 감지해야합니다.

참고 : 업로드시 Content-Type헤더에 설정된 MIME 유형에 의존하는 것은 안전하지 않습니다 . 헤더는 클라이언트에서 설정되며 임의의 값으로 설정할 수 있습니다. 대신 php 파일 정보 함수를 사용 하여 서버에서 파일 MIME 유형을 감지 할 수 있습니다 .


다운로드 :

zip파일 을 다운로드하려는 경우 다른 Accept헤더 값 은 하나만 설정해야 합니다. 서버가 Accept헤더 요청 된 MIME 유형 에서 사용자를 충족시킬 수없는 경우 추가 값 세트가 대체로 사용됩니다 .

WC3 사양 에 따르면 다음과 같습니다.

application/zip, application/octet-stream 

:로 intrepreted 될 것 "나는 좋아 application/zip마임 타입을하지만,이 제공 할 수없는 경우 application/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 타입을 얻을 수있는 몇 가지 목표 - 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.