2013-03-14 5 views
29

받은 파일이 PHP의 이미지인지 확인하는 방법이 있습니까?PHP 파일이 이미지인지 확인하십시오.

script을 업로드하고 확장명을 원하는대로 변경하면 확장 프로그램 테스트가 내게 안전하지 않습니다.

나는 getimagesize을 사용해 보았지만 그 특정 문제에 더 적합한 것이있을 수 있습니다.

+0

[업로드 된 파일 형식 검사 (PHP)] (http://stackoverflow.com/questions/6755192/uploaded-file-type-check-by-php) 및 [업로드 된 보안 스레드] (http : /stackoverflow.com/questions/11061355/security-threats-with-uploads) – deceze

+0

http://stackoverflow.com/questions/173868/how-to-extract-a-file-extension-in-php –

+2

@Pramod 그냥 확인 파일 확장자는 정확하게 * 충분하지 않습니다. – deceze

답변

15

MIME 형식 얻을 수있는 기본 방법 :

MIME 형식이 exif_imagetypegetimagesize 있습니다 얻을 finfo_fopen()

대안 PHP> 5.3 사용하기 위해 PHP < 5.3 사용 mime_content_type()
를 들어,하지만이 적절한 데에 의존 libs가 설치되었습니다. 또한 그들은 magic.mime에 주어진 전체 목록 대신 이미지 mimetypes를 반환 할 가능성이 높습니다.

mime_content_type은 (는) PHP5.3에서 제거되었지만 해당 버전 아래에서 제대로 작동합니다. E_STRICT은 더 이상 사용되지 않는 것에 대한 통지를 제기하지 않습니다. 시스템에서 사용할 수있는 기능에 대해 신경 쓰지 않으려면 함수 호출을 사용할 수있는 것으로 위임 한 프록시 메소드로 네 가지 함수를 모두 감싸기 만하면됩니다 (예 :

function getMimeType($filename) 
{ 
    $mimetype = false; 
    if(function_exists('finfo_fopen')) { 
     // open with FileInfo 
    } elseif(function_exists('getimagesize')) { 
     // open with GD 
    } elseif(function_exists('exif_imagetype')) { 
     // open with EXIF 
    } elseif(function_exists('mime_content_type')) { 
     $mimetype = mime_content_type($filename); 
    } 
    return $mimetype; 
} 
+0

유감스럽게도 이것은 사용되지 않는 것으로 보입니다. – sf89

+0

방금 ​​내 대답을 업데이트했습니다. 당신이 이것을 시도 할 수 있습니다 –

+0

exif_imagetype을 사용하여 내가 찾고있는 것 같습니다. 감사! – sf89

55

getimagesize() 파일 이미지인지 운동의 가장 확실한 방법 같아야이 샘플 getimagesize이므로() 출력

if(@is_array(getimagesize($mediapath))){ 
    $image = true; 
} else { 
    $image = false; 
} 

:

Array (
[0] => 800 
[1] => 450 
[2] => 2 
[3] => width="800" height="450" 
[bits] => 8 
[channels] => 3 
[mime] => image/jpeg) 
+0

그래, 이건 내 직감 이었어.하지만이 방법을 속일 수있을 때, 파일의 형식을 얻는 데 정확히 맞는 것을 찾고 있었다. 나는 이것을 GIF로 보았다. (http://ha.ckers.org/blog/20070604/passing-malicious-php-through-getimagesize/). – sf89

+13

'getimagesize'가 실패하면 false를 반환하므로'$ image = getimagesize ($ mediapath)? true : false;' – neokio

+1

if ($ array = getimagesize ($ mediapath)) {// 참인 경우 $ array를 사용하십시오.}' –

10

파일 확장자와 getimagesize 기능을 사용하면 업로드 된 파일에 r이 있는지 검색 할 수 있습니다. ight 형식은 엔트리 레벨 검사 일 뿐이며 실제 확장자와 이미지 헤더의 일부 바이트가 포함 된 파일을 업로드하여 우회 할 수 있습니다.

안전성을 위해 업로드 된 사진을 축소/크기 조정 (원본 이미지 크기 포함) 할 수 있으며 업로드 된 사진 대신이 버전을 저장할 수 있습니다. 파일 콘텐츠를 업로드하고 파일을 찾기 위해 <?php과 같은 특수 문자를 검색하는 것도 가능합니다.

+0

조금 무겁지 않습니까? 나는 그것을 조사 할 것이다. – sf89

관련 문제