간단한 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
zip
또는 rar
파일을 전혀 보장하지 않습니다 . 에 따르면 WC3 사양 이로 intrepreted 될 것입니다 : "내가 좋아 application/zip
| application/x-rar-compressed
콘텐츠 형식을하지만,이 제공 할 수없는 경우 application/octet-stream
(파일 스트림은) 좋은 또한".
multipart/x-zip
유효 할 수 있습니까? 여러 부분이 아닙니다. SitePoint 목록에 부정확 한 MIME 유형이 많이 있으며 완전하지 않습니다. 공식 IANA Media Types 레지스트리 는 100 % 완료되지 않았습니다.
MIME 형식의 공식 목록은 IANA (Internet Assigned Numbers Authority) 에서 찾을 수 있습니다 . 에 대한 목록 Content-Type
헤더에 따르면 zip
입니다 application/zip
.
rar
파일 의 미디어 유형 은 공식적으로 IANA에 등록되어 있지 않지만 비공식적으로 일반적으로 사용되는 MIME 유형 값은 application/x-rar-compressed
입니다.
application/octet-stream
수단만큼 : "나는 당신에게 파일 스트림 및 지정되지 않은 스트림의 내용을 보내" (이 될 수 있다는 사실 때문에 zip
나 rar
뿐만 아니라 파일). 서버는 스트림의 실제 내용이 무엇인지 감지해야합니다.
참고 : 업로드시 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
서버가 요청을 충족시킬 수없는 경우 응답)을 보장합니다 .
믿지 말고 $_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 타입을 얻을 수있는 몇 가지 목표 - 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
}
}