2014-04-07 4 views
0

안녕하세요. 성공적으로 내 서버에 파일을 업로드하는 두 개의 PHP 파일을 만들었습니다. 하나의 파일은 upload.php라는 웹 사이트의 시각적 부분이고 다른 하나는 upload_file.php라는 업로드 파일 부분입니다. 내 파일을 업로드하는 코드는이 그러나 그것은 나를 어떤 파일 형식을 업로드 할 수 있습니다 완벽하게 작동업로드 한 파일을 zip 파일 만 허용하도록 제한하려면 어떻게합니까?

move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}"); 

입니다. 그래서 나는 zip 폴더만을 허용하고 싶기 때문에이 if 문을 시도했다.

if($type=="application/zip"){ 
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}"); 
echo "<div id='mes'> File upload complete</div>";} 
else{ 
echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>"; 
} 
where $type=$_FILES['file']['type']; 

하지만 이제는 파일을 압축하지 않은 파일도 업로드 할 수 있습니다. 그렇다면 zip 폴더 만 업로드 할 수 있도록 if 문에 넣어야하는 것은 무엇입니까? 그리고 당신이 정말로 좋은 사람들이라면, ifin 문에 USERINITIAL.DATE.TIME 또는 USERINITIAL/DATE/TIME의 명명 규칙을 사용하여 압축 된 foleders 만 허용해야합니까? 아니면이 작업을 수행 할 수 없습니까?

답변

0

이 스레드에 대한 일부 토론으로 약간의 보너스 정보가 있습니다. 일반적으로 말하자면 파일이 실제로 우리가 원하는 종류의 파일인지 판단하는 것은 정말로 어렵습니다. 클라이언트가 수정할 수있는 MIME 유형을 확인할 수 있습니다. 클라이언트가 수정할 수도있는 파일 확장자를 확인할 수 있습니다. 그 반대도 마찬가지입니다. 파일의 처음 몇 줄을 검사 할 수도 있습니다. 일반적으로 어떤 종류의 헤더가 포함되어있어 처리 할 파일의 종류를 설명합니다. 그러나 여전히 파일은 실행중인 프로그램의 버퍼 오버플로를 만드는 악의적 인 천재에 의해 수정되거나 파일을 열거 나 보거나 취하거나 던지기 위해 사용 된 일부 라이브러리를 악용 할 수 있습니다.


파일 확장명과 MIME을 모두 확인합니다.

먼저 확장 프로그램.

$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 
$isZipExtension = ($extension == "zip" ? true : false); 

"$ _FILES"배열에는 "유형"이라는 색인이 있습니다.

이제 업로드를 제한하여 Zip 파일 만 허용하려고합니다. 잠재적 인 zip 파일을 정의하는 몇 가지 유형이 있습니다. 그래서 배열을 만들 수 있습니다.

$zipTypes = array('application/zip', 'application/x-zip-compressed', 
'multipart/x-zip', 'application/x-compressed'); 

업로드 된 유형이 배열의 일부인지 확인합니다.

$isZipFile = in_array($_FILES['file']["type"], $zipTypes); 

파일이 배열에있는 경우 업로드 프로세스를 수행하십시오.

if($isZipFile && $isZipExtension) { 
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}"); 
echo "<div id='mes'> File upload complete</div>"; 
} else { 
echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>"; 
} 

는 모두 함께

$zipTypes = array('application/zip', 'application/x-zip-compressed', 
    'multipart/x-zip', 'application/x-compressed'); 

    $extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 
    $isZipExtension = ($extension == "zip" ? true : false); 
    $isZipFile = in_array($_FILES['file']["type"], $zipTypes); 

    if($isZipFile && $isZipExtension) { 
     move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}"); 
     echo "<div id='mes'> File upload complete</div>"; 
    } else { 
     echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>"; 
    } 

는 도움이되기를 바랍니다.

+0

신뢰를 미디어 유형은 클라이언트가 스푸핑 할 수 있기 때문에 나쁜 생각입니다. 또한 파일 확장자를 선택하면 파일 확장명을 선택할 수 있습니다. 적어도 허용 목록을 허용 체크 만하면 그들이 좋아하는 것을 선택할 수 없습니다. – Jon

+0

이드는 오히려이 두 가지를 혼합하고 싶습니다. 파일 확장 스푸핑은 harmfull 일 수 있습니다. –

+0

이 작업을 수행하지 못했습니다. 압축 된 파일을 업로드하려고 할 때 else로 이동합니다. 제한된 명명 규칙에 대해 말하지 않았습니다. – user257033

2

당신은이 솔루션을 사용할 수 있습니다

$fileName = strtolower($fileName); 
$allowedExts = array('zip'); 
$extension = explode(".", $fileName); 
$extension = end($extension); 
if(in_array($extension, $allowedExts)) 
{ 
    //move file to custom folder 
} 
  • 중요 * 결코하지가 변조 데이터를 우회하기 때문에, 식별 파일 형식에 대한 MIME 시간에서 사용합니다.
    가장 좋은 방법은
    업로드 할 때 모든 업로드 된 파일을 public_html 밖으로 이동하고 파일 이름을 항상 바꿉니다.
    그래서, 예를 들어, 데이터베이스에 업로드 된 파일 이름을 저장하고, 하나 개의 PHP 파일에서 파일을 읽을 :

    read.php ID = 당신의 read.php 파일에서 5
    , 당신이 가야 ID 번호와 검색을 그런 다음 db에서 파일 이름을 반환하고이 파일을 read.php 파일로 다운로드하거나 읽습니다.

0

아이러니하게도, 당신은 이 업로드되는 파일의 종류를 확인하기 위해 type 키를 사용해서는 안됩니다. 그 열쇠의 가치가 클라이언트에 의해 설정되고 사소한 스푸핑 될 수 있기 때문입니다.

당신이 (적어도 어떤 예기치 않은 방식으로 업로드 처리합니다 당신의 서버에 프로그램을 잘 구성되어 있지 있는지 확인합니다) 파일 확장자 확인되는 대신 일을해야한다 :

$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 
$allowed = ['zip']; 
if (in_array($ext, $allowed)) { 
    // process the file 
} 
+0

Jon 코드가 작동하지 않았지만 올바른 경로로 안내해 주셔서 감사합니다. – user257033

+0

@ user257033 : 어떻게 작동 했습니까? 너 대신 무엇을 했니? – Jon

+0

allowed = "압축", if ($ ext == $ allowed) – user257033

관련 문제