2011-04-09 3 views
0

내 사이트에 사용자가 파일을 업로드 할 수있는 페이지가 있습니다. 하나의 이미지와 하나의 사운드 파일을 업로드하도록 허용합니다. 원하지 않으면 파일을 추가 할 필요가 없으며 원하는 경우 파일을 추가 할 수도 있습니다. 문제는 사용자가 두 파일을 모두 선택하면 스크립트가 작동한다는 것입니다. 아무도 선택하지 않거나 하나만 선택하면 스크립트는 선택되지 않은 파일을 찾을 수 없으므로 '잘못된 파일'을 내뱉습니다. if((isset($_FILES['filetoupload1'])) && (isset($_FILES['filetoupload2']))) { }여러 파일을 업로드 할 때 발생하는 문제 PHP

다음

if (isset($_FILES['filetoupload1'])) { 
    if (($_FILES["filetoupload1"]["type"] == "image/gif") 
     || ($_FILES["filetoupload1"]["type"] == "image/jpeg") 
     || ($_FILES["filetoupload1"]["type"] == "image/pjpeg") 
     || ($_FILES["filetoupload1"]["type"] == "image/png") 
     || ($_FILES["filetoupload1"]["type"] == "image/jpg") 
    ) { 
     if ($_FILES["filetoupload1"]["error"] > 0) { 
      echo "Return Code: " . $_FILES["filetoupload1"]["error"] . "<br />"; 
     } else { 
     if (file_exists("media/" . $_FILES["filetoupload1"]["name"])) { 
       echo $_FILES["filetoupload1"]["name"] . " already exists. "; 
      } 
      move_uploaded_file(
       $_FILES["filetoupload1"]["tmp_name"], 
       "media/" . $_FILES["filetoupload1"]["name"] 
      ); 
     } 
    } else { 
     echo "Invalid file"; 
    } 
} 


if (isset($_FILES['filetoupload2'])) { 
    if ($_FILES["filetoupload2"]["type"] == "audio/mp3") { 
     if ($_FILES["filetoupload2"]["error"] > 0) { 
      echo "Return Code: " . $_FILES["filetoupload2"]["error"] . "<br />"; 
     } else { 
     if (file_exists("media/" . $_FILES["filetoupload2"]["name"])) { 
       echo $_FILES["filetoupload2"]["name"] . " already exists. "; 
      } 
      move_uploaded_file(
       $_FILES["filetoupload2"]["tmp_name"], 
       "media/" . $_FILES["filetoupload2"]["name"] 
      ); 
     } 
    } else { 
     echo "Invalid file"; 
    } 
} 

등을 모두 제 1 및 제 2 업로드 스크립트 전에 사용자가 이미지와 오디오 파일을 모두 선택했다면 :

내가 사용했습니다. 다른 말로 표현하면 다음과 같습니다.

if filetoupload1 isset then run upload script that filters images. 
if filetoupload2 isset then run upload script that filters audio. 
if filetoupload1 AND filetoupload2 isset then run both upload scripts. 

이렇게 설정했습니다. 위 내용은 파일 업로드의 모든 조합을 허용해야합니다. 권리? 하지만 그것은 그렇게 작동하지 않습니다 ..

이제 무엇을 해야할지 잘 모릅니다. 다음은 오디오 업로드 스크립트입니다. 이미지는 거의 동일합니다.

누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?

+0

는 "작동하지 않습니다"무슨 뜻인지 명확히하십시오. 출력, 예상 결과, 실제 결과 등 – cweiske

+0

오류가 발생합니다. 잘못된 파일입니다. 파일을 선택하지 않으면 두 개의 '잘못된 파일'오류가 발생합니다. 두 파일을 모두 선택한 경우에만 작동합니다. 사용자가 자신의 뉴스 포스트에 올릴 내용을 선택할 수 있기를 원합니다. 뉴스 클립을 올리려면 항상 사운드 클립이나 이미지가 없거나 이미지 클립이있는 것은 아닙니다. – nutman

+0

파일을 업로드하지 않으면 잘못된 파일이 표시됩니다. 업로드 된 파일이 없으면 잘못된 파일이 두 번 표시되는 것은 논리적입니다. 귀하의 코드는 귀하가 성취하고자하는 것을 허용합니다. 에코를 제거하거나 원하는 경우 무언가를하십시오. –

답변

2

"I get the error: Invalid file"

코드가이 작업을 수행하기 때문에 올바른 것입니다. 파일이 설정되어 있는지 확인하지 말고 $_FILES["filetoupload1"]["type"]이 비어 있지 않은지 확인하십시오.

+0

나는 당신이 나를 이해했다고 생각하지 않는다. 또는 나는 너를 이해하지 못했다. 나는 더 명확하게하기 위해 나의 질문을 편집했다. – nutman

+0

당신이 실제로 게시 한 새로운 소스 코드가 그것을 더 잘 이해하는 데 도움이된다. – cweiske

1

스크립트는 웹 서버가 액세스 할 수있는 모든 파일에 수 스톰있는 악의적 인 사용자에 서버가 취약합니다 :

$_FILES[...]['name'] - user supplied 
$_FILES[...]['type'] - user supplied 

당신은 클라이언트가 파일에 대한 적절한 MIME 타입을 공급하고 있음을 신뢰하고를, 하지만 누군가가 요청을 위조하고 "virus.exe"를 업로드하고 MIME 유형을 'image/jpeg'로 설정하는 것을 막을 수는 없습니다. 또한 원격 파일 이름은 사용자가 제어 할 수 있기 때문에 악의적 인 데이터로 파괴 될 수 있습니다. 마임 유형이 "오른쪽"때문에, 스크립트에 따라 완전히 합법적 인

$_FILES['picture']['type'] = 'image/gif' 
$_FILES['picture']['name'] = 'remote_server_control.php' 

을, 아직 당신은 지금 당신의 서버에 사용자가 제공 한 PHP 스크립트를 넣어 한 그와 함께 그들이 전체를 제어 할 수 있습니다 : 고려 귀하의 사이트 및/또는 서버.

결코 $_FILES 배열의 데이터를 신뢰하지 마십시오. 서버 측 유틸리티를 통해 항상 MIME 유형을 결정하십시오. 스크립트가 이미지를 처리하기로되어 있다면 getimagesize()을 사용하십시오. 또한 사용자가 제공 한 파일 이름을 사용하지 마십시오. 서버 쪽에서 결정된 것을 사용하여 databasde auto_increment ID 번호와 같은 파일 이름을 지정하십시오. 코드가 기존 파일을 덮어 쓰지 못하도록하더라도 새로운 이름과 호기 ... 리모트 인계 스크립트의 새로운 버전을 제시하는 것은 사소한 일입니다.

1

내가 숨겨진 텍스트를 추가하는 당신에게 제안,이 마녀 업로드 필드가 활성 확인합니다 숨겨진, 당신은 자바 스크립트와이 검사를합니다

<html lang="en"> 
<head> 
<meta charset="utf-8"> 
<style> 

</style> 

<script type="text/javascript"> 
function uploadForm() 
{ 
var size = 0; 
var x = document.forms["myForm"]["upload1"].value.length; 
var y = document.forms["myForm"]["upload2"].value.length; 
if (x > 0) 
    { 
    size = 3; 
    } 
if (y > 0) 
{ 
    size += 2; 
} 
return size; 
} 
</script> 

</head> 
<body> 


<form name="myForm" action="" method="GET" onsubmit="chose.value = uploadForm()"> 
<input type="file" name="upload1"><br> 
<input type="file" name="upload2"><br> 
<input type="hidden" name="chose" value=""><br> 
<input type="submit" value="Submit"> 
</form> 


</body> 
</html> 

을 이제 양식을받을 때, 당신은 확인해야 의 값이 2 경우, 신청 선택했다, 즉 비어 있지 않은 이미지 필드를 의미하고, 신청 3 오디오는 5 모두하지 빈, 비어 있지 :

<?php 
switch($_GET["chose"]) 
{ 
case 2: 
// 
break; 
case 3; 
// 
break; 
case 5: 
// 
break; 
default: 
// here the user doesn't use any field 

} 
?> 
+0

나는 이것이 효과가 있었지만 스위치가 작동하지 않는다고 생각했다. 나는 코드를 3 번 ​​확인했다. 내가 이해하지 못하는 유일한 비트는 자바 스크립트입니다. 어떻게 그 자바 스크립트 코드는 $ _GET 수 있도록 주소 문자열에 값을 넣을 수 있습니까? – nutman

+0

우리는 upload1 길이를 검사합니다. 0보다 크다면 이것은 사용자가 어떤 것을 넣었 음을 의미합니다. 따라서 여기에 2를 추가합니다. 두 번째 필드에 적용되는 것과 동일한 것은 3을 추가합니다. 양식이 제출되면 우리는 마녀가 0,2,3 또는 5를 반환 할 함수를 실행합니다. 어떤 사용자가 사용했는지에 따라 달라 지거나 전혀 사용되지 않습니다.이 값은 숨겨진 파일을 선택하도록 지정되어 형식, 서버 쪽에서 우리는 선택의 가치를 확인하고 우리는 그것이 가치가 무엇에 의존하기로 결정, 나는 당신이 이해하기를 바랍니다, 나는 영어 원어민이 아니기 때문에 미안 해요. – SIFE

관련 문제