파일 업로드에서 가장 중요하게 생각되는 부분이 확장자 추출이 아닐까 싶습니다. 

다음 함수로 문제시 되는 파일명(또는 확장자)를 가진 파일을 필터링하여 보다 안전하게 관리할 수 있겠습니다. 

다음 문자열을 포함한 파일이라면 false 를 반환하고, ".exe. .." 과 같이 부적절한 확장자도 실행 가능한 파일로 인식하므로 정확하게 exe 파일 확장자를 추출하여 줍니다.

 \/:*?\"'<>|\n\t\r\x0\x0B

<?php
 function cExtraction($extensions) 
 { 
   $return = false; 
   if(strlen($extensions) === strcspn($extensions, "\\/:*?\"'<>|\n\t\r\x0\x0B")) 
   { 
     if(false !== strpbrk($extensions, '.')) 
     { 
       $return = strtolower(trim(substr($extensions, strcspn($extensions, '.')), '. ')); 

       if(false !== strpbrk($return, '.')) 
       { 
         return trim(strrchr($return, '.'), '. '); 
       }  
     } 
  } 
  return $return; 
 } 
 ?>

다음 예제에서 \n 을 포함한 파일명이므로 false 입니다.

<?php   
 $file = " f.ile. \n  zip.zzzz.aswqww.dwq....wqe.w..ddd.cd.d....";   
 if(false !== ($ext = cExtraction($file)) 
 { 
   echo "'" . $ext . "'";
 } 
 ?> 

다음 예제에서는 확장자 d 를 반환합니다.

<?php   
 $file = " f.ile.  zip.zzzz.aswqww.dwq....wqe.w..ddd.cd. . d ...";   
 if(false !== ($ext = cType_Extraction($file)) 
 { 
   echo "'" . $ext . "'"; // 출력: d
 }
 ?>

<?php   
 $file = " f.ile";   
 if(false !== ($ext = cType_Extraction($file)) 
 { 
   echo "'" . $ext . "'"; // 출력: ile
 }
 ?>

0 댓글