2012-10-12 3 views
0

가능한 중복 :
How can I only allow certain filetypes on upload in php?만 허용 .JPG 및 .PNG 파일 만

어떻게 난 단지 아래의 스크립트 .JPG 이미지 나 .PNG 이미지를 허용 할 수 있습니까? 세션 사용자 이름과 일치하는 이미지 디렉토리를 mysql 테이블에 업로드합니다. 파일 형식을 제한 할 수 있습니까? 난 단지 .JPG 또는

if ($_POST['submit']) { 
    //get file attributes 

    $Name = $_FILES['myfile']['name']; 
    $tmp_name = $_FILES['myfile']['tmp_name']; 
    error_reporting(E_ERROR | E_PARSE); 

    if ($Name) {    
    $location = "avatars/$Name";  
    move_uploaded_file($tmp_name, $location) or die('Failed to upload picture'); 
    $query = mysql_query("UPDATE fgusers3 SET imagelocation='$location' WHERE name='$name'") or die("Your profile image has been uploaded!"); 

    }} 



echo "Upload your image below: 
    <form action='profilepic.php' method='POST' enctype='multipart/form-data'> 
    Profile Picture: <input type='file' name='myfile'> <input type='submit' name='submit' value='upload'> 
    </form>"; 
+0

스푸핑 확장, MIME 형식 등 여러 가지 방법이 있습니다. 업로드 된 파일을 처리 할 때는이 사실에 유의하십시오. –

답변

1

.png를 필요하기 때문에 당신은 실제의 형태를 확인하는 exif_imagetype($tmp_name)을 사용할 수 있습니다 당신은 pathinfo & exif_imagetype

if(pathinfo($Name,PATHINFO_EXTENSION) != "jpg" || exif_imagetype($Name) != IMAGETYPE_JPEG) 
{ 
    // throw error 
} 

See More Info to detect Fake Images

+1

당신은 너무 빠릅니다.) – GBD

+0

@ hakre는 한때 ..... 감사합니다. 어쨌든 :) – Baba

0
$whitelist = array(".jpg",".png"); 
foreach ($whitelist as $item) { 
    if(preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) { 
    $uploaddir='uploads/uploads_image/'; 
    // or code 
    } 
} 
+0

이 안전한가요? 특히 RCE에 스크립트 업로드를 반대합니까? – evandrix

1
if($_FILES){ 
    $allowedExtensions = array("jpg","png"); 

    foreach($_FILES as $key=>$val){ 
     if(!empty($val['tmp_name'])){ 
      $ext = end(explode(".",strtolower(basename($val['name'])))); 
      if(in_array($ext,$allowedExtensions)){ 
       $file = 'PATH_TO_UPLOAD'.basename($val['name']); 

       if(move_uploaded_file($val['tmp_name'],$file)){ 
        //SUCCESS_MESSAGE 
       } 
      }else{ 
       //FAIL_MESSAGE 
      } 
     } 
    } 
} 
+0

+1 '끝'을 만나지 않았 음! –

1

를 사용하여 시도 할 수 있습니다 파일의 헤더를 기반으로합니다. 이렇게하면 파일 내용을 기준으로 유형을 확인하므로 가장 신뢰할 수 있습니다 (예 : 누군가가 너에게 ".png"확장자를 가진 JPG를 제공하더라도 올바른 정보를 제공함).

type 속성 ($_FILES['myfile']['type'])도 있습니다.이 속성은 브라우저에서 해당 파일의 소유권을 주장하는 MIME 형식을 제공합니다. 그러나 누군가가 악의적으로 요청을 위조하면이를 신뢰할 수 없습니다.

0

$ imageType = getimagesize ($ tmp_name); 스위치 ($ imageType [ 'mime']! = "image/jpg"또는 $ imageType [ 'mim']! = "image/png") { // 여기에 오류 코드가 있습니다. }

쉽게 확장명을 변경할 수 있으므로 확장자를 확인하는 것보다 조금 안전합니다. mime 유형도 변경 될 수 있지만 더 많은 지식이 필요합니다. xD

0

물론 파일 확장자로 제한 할 수는 있지만 안전하지 않습니다. gif 파일의 이름을 변경하고 업로드 할 수 있습니다. 좀 더 안전한 것은 mime-type을 사용하여 파일 유형을 감지하는 것입니다 (그러나 여전히 보장되지 않습니다). 다음을보십시오 : How do I find the mime-type of a file with php?

나는 이미지의 크기를 얻으 려하거나 다른 이미지 유형으로 변환하는 것이 더 안전하다고 생각합니다.