2012-07-09 2 views
0

사용자가 이미지를 제출하고 서버에 업로드 할 수 있도록 PHP 코드를 작성합니다. 나는 그것이 작동하게하고 서버가 이미지를받습니다. 그러나 서버가 .avi 및 .flv 파일을 받아들이는 것처럼 보입니다. 파일이 이미지인지 여부를 확인하기 위해 if/else 문을 쓰지만 작동하지 않는 이유는 무엇입니까? 당신내 업로드 이미지 코드에서 avi 및 flv 파일을 허용하는 이유

감사이이 행의 코멘트는 내 PHP 코드

$tmpPath = $_FILES["image"]["tmp_name"]; 
$movedPath = "submit-img/" . $_POST["category"] . "/" . $_FILES["image"]["name"]; 

$fullURL = parse_url($_SERVER['HTTP_REFERER']); 
$query = explode("&", $fullURL["query"]); //only choose first query 
$prevPage = "gallery.php" . "?" . $query[0]; 

//I get the file type here 
$fileType = strpos($_FILES["image"]["type"], "image/"); 

//if its not an image then redirect to the previous page and send a message 
if ($fileType === false || ($_FILES["image"]["size"]) == 0 || $_FILES["image"]["size"]/1024 > 5000){ 
    $prevPage = $prevPage . "&imgSubmit=none#imgSubmitForm"; 
    header("Location: " . $prevPage); 
}else if ($_FILES["image"]["size"] > 0){ //if file is an image 
    if (!is_file($movedPath)){ 
     move_uploaded_file($tmpPath, $movedPath); 
    }else{ 
     while (is_file($movedPath)){  
      $extension = strrchr($movedPath, "."); 
      $movedPath = str_replace($extension, "", $movedPath) . "1" . $extension; 
     } 
     move_uploaded_file($tmpPath, $movedPath); 
    } 
    $prevPage = $prevPage . "&imgSubmit=submitted#imgSubmitForm"; 
    header("Location: " . $prevPage); 

}

+0

이미지 만 필터링하고 있습니까? – javajavajava

+0

가능한 복제본 [파일 업로드 제한 특정 파일 형식] (http://stackoverflow.com/questions/6099968/file-upload-restrict-certain-file-type) –

+1

파일이 있는지 여부 만 확인하는 것 같습니다. 확장자 및 파일 크기가 0이 아니고 5MB 미만인지 여부를 지정합니다. 어떤 파일도 업로드 할 수 있습니다. – Wug

답변

0
}else if ($_FILES["image"]["size"] > 0){ //if file is an image 

근본적으로 잘못된 것입니다. $_FILES에있는 size 키는 파일 크기 (바이트)입니다. 그것은 "파일이 이미지인지"여부와 아무 관련이 없습니다. (특히,이 하지 이미지의 실제 크기입니다.)

당신이 파일은 이미지입니다 여부를 테스트 할 필요가있을 경우, 가장 좋은 방법은 getimagesize 기능을 사용하는 것입니다. 이 함수는 PHP가 인식 할 수있는 이미지 유형이면 이미지의 크기를 반환하고, 이미지가 아닌 것으로 보이는 경우 0을 반환합니다.

파일이 이미지인지 여부를 확인하기 위해 type 어레이의 type 필드를 사용하여 $_FILES 어레이의 필드를 사용하지 마십시오. 이 입력란은 서버가 아니라 브라우저에 의해 채워지며, 오해의 소지가 있거나 잘못된 정보가 포함될 수 있습니다.

+0

감사합니다. 유용 그 – kaboom

0

하지 대답,하지만 코드는 공격에 매우 취약하다 :

1) 업로드 성공을 확인하고 성공 DID 생각하지 않습니다.

if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['image']['error']); 
} 

2) 당신은 당신의 검증을위한 ['type'] 필드를 사용 : 당신은 아무것도하기 전에 항상 업로드 실패를 확인하십시오. 이는 사용자가 제공하는 값이며 신뢰할 수 없습니다. 악의적 인 사용자가 그 값을 임의로 조작하여 image/jpeg라고 말하면서도 nastyvirus.exe을 업로드 할 수 있습니다.

3) 서버에 저장하기 위해 ['name'] 필드를 사용하고 있습니다. 이는 사용자가 제공 한 데이터이기도하며 경로 정보를 포함하는 것으로 쉽게 다룰 수 있습니다 (예 : ../../../../../../../etc/passwd. 맹목적으로 사용하고 있기 때문에 악의적 인 사용자가 웹 서버가 액세스 할 수있는 서버의 파일을 쓸어 넘길 수 있습니다.

+0

그들을 지적 주셔서 감사합니다. 3 번을 고치는 법을 말해 줄 수 있니? 감사 – kaboom

관련 문제