2012-11-14 2 views
0

* .cpp 소스 파일을 업로드 할 수 있도록 간단한 PHP 스크립트를 설계하고 있습니다. 기본 보안 조치로 임시 파일을 영구 위치로 이동하기 전에 임시 파일의 MIME 유형을 확인합니다. 터미널 (Mac OS X)에서 file --mime myfile.cpp을 실행하면 text/x-c으로 표시됩니다. 그러나 서버는 어떤 이유에서이 메시지를 application/octet-stream으로 봅니다. /etc/mime.types에서 "cpp"확장자는 text/x-c++src에 있으며 Mac에서 MIME 유형에 문제가 있다고 생각됩니다.PHP에서 잘못된 MIME 유형을보고합니다.

우분투에서 같은 절차를 시도했는데 정상적으로 작동합니다 (text/x-c++src). 두 컴퓨터에서 Chrome을 사용하고 있습니다.

정확히 프로그래밍 문제는 아니지만, 익숙하지 않은 PHP 트릭이있을 수 있습니다.

$temp_file=$_FILES["file"]["type"]; 
if(($temp_file!="text/x-c++src")||($temp_file!="text/x-c")) { 
    echo "<p style=\"color:red;font-style:italic\">Please upload a valid C++ file.</p>"; 
} 

답변

0

서버는 업로드 한 브라우저에 어떤 유형이 있는지를 확인합니다.

브라우저는 일반적으로 파일 유형을 결정하는 데 그리 좋지 않으며 악의적 인 업 로더는 항상이를 무시할 수 있습니다.

마임 유형을 신뢰할 수 없습니다. 합리적으로 파일 유형을 알고 싶다면 file과 같은 유틸리티를 사용하여 데이터를 스니핑해야합니다.

1

$_FILES['userfile']['type']에는 브라우저가 전송 한 MIME 유형이 포함됩니다 (업로드하는 동안). 당신은 그것을 사용할 수는 있지만 그것을 믿을 수는 없습니다.

사용하여 $_FILES['userfile']['tmp_name']에서 마임 타입을 받고보십시오 :

$mime = mime_content_type($tmp_name); 
// or, as this is deprecated: 
$info = new finfo(FILEINFO_MIME_TYPE); 
$mime = $info->file($tmp_name); 

를 또는, strrchr($_FILES['userfile']['name'], '.') 원래 파일 이름의 확장자로 추측 할 수있다.

+0

업로드 된 파일의 확장명을 사용하고 싶지 않습니다. 스푸핑이 매우 쉽기 때문입니다. finfo() 메소드를 살펴 보겠다. 고마워. – ad2476

관련 문제