2009-05-13 3 views
3

zip 보관 파일에서 스크립트가있는 디렉터리로 파일을 추출하는 스크립트를 작성하고 있습니다.압축 디렉터리 내 우편 번호

$zip = new ZipArchive; 
if ($zip->open('latest.zip') === TRUE) { 
    $zip->extractTo('.'); 
    $zip->close(); 
    unlink('installer.php'); 
    echo 'it works!'; 
} else { 
    echo 'failed'; 
} 

이 잘 작동하지만 한 가지 문제가있다 :

여기 내 코드입니다. 지퍼에는 추가 레이어가 있습니다. (zip/directory/files).이 디렉토리/파일을 파일처럼 추출합니다.

이 추가 레이어를 제거 할 수있는 방법이 있습니까?

도움 주셔서 감사합니다. 조엘 Drapper로부터 파일을 방지하기 위해

+1

조심 나중에 압축을 풀 파일. 당신은 zip 폭탄에 취약 해집니다 : http://en.wikipedia.org/wiki/Zip_bomb –

답변

2

덮어지고

, 당신은 아마 먼저 디렉토리에 zip 파일을 추출 할. 또한, 자신의 위험에 사용, 그것을

<?php 

// Generate random unzip directory to prevent overwriting 
// This will generate something like "./unzip<RANDOM SEQUENCE>" 
$pathname = './unzip'.time().'/'; 

if (mkdir($pathname) === TRUE) { 

    $zip = new ZipArchive; 

    if ($zip->open('latest.zip') === TRUE) { 

    $zip->extractTo($pathname); 

    // Get subdirectories 
    $directories = glob($pathname.'*', GLOB_ONLYDIR); 

    if ($directories !== FALSE) { 

     foreach($directories as $directory) { 

     $dir_handle = opendir($directory); 

     while(($filename = readdir($dir_handle)) !== FALSE) { 

      // Move all subdirectory contents to "./unzip<RANDOM SEQUENCE>/" 
      if (rename($filename, $pathname.basename($filename)) === FALSE) { 
      print "Error moving file ($filename) \n"; 
      } 
     } 
     } 
    } 

    // Do whatever you like here, for example: 
    unlink($pathname.'installer.php'); 

    } 

    // Clean up your mess by deleting "./unzip<RANDOM SEQUENCE>/" 
} 

를이 코드를 테스트하지, 그래서 : 어떤 하위 디렉토리를 확인 후 해당 이사에 우편 번호를 추출하고, 임의의 이름을 가진 디렉토리를 만들 것 Windows 시스템에서 의도 한대로 작동하지 않을 수 있습니다. 또한, 모든 기능에 대한 문서를 체크 아웃 내가 사용 : 사용자가 우편을 업로드 할 수 있도록 할 때

+0

당신의 도움에 감사드립니다! 스크립트가있는 디렉토리가 비어 있음을 알고 있으므로 다른 디렉토리를 만들 필요가 없습니다. 필자는 zip (및 무작위 쓸모없는 디렉토리 계층) 내에서 스크립트가있는 폴더에 파일을 추출하려고합니다. –