2012-07-21 97 views
2

當使用PHP壓縮類提取一個zip文件(其實這是不好的,但誰知道?),PHP拉鍊無限循環

$ unzip -t 1.zip 
    file #47: bad zipfile offset (local header sig): 574665 
    ... 
    At least one error was detected in 1.zip. 

    <?php 
    function unzip($apkpath, $dirname) { // 
     $zip = new ZipArchive; 
     $res = $zip->open($apkpath); 
     if ($res === TRUE) { 
      $zip->extractTo($dirname); 
      $zip->close(); 
      return true; 
     } else { 
      return false; 
     } 
    } 
    unzip('com.nd.sms.zip', '2'); // It's ok 
    //unzip('1.zip', '2');   //this line go into infinite loop and very heigh cpu 
    unzip('com.nd.sms.zip', '2'); 
    ?> 

任何人都知道如何安全地使用ZipArchive,或其他附加信息替代,或者某種方式來檢查壓縮文件是否有效? 另外,我使用php5.3.14 + ubuntu。
我知道有, https://bugs.php.net/bug.php?id=53230 https://bugs.php.net/bug.php?id=57905

+0

出於安全原因更新系統庫。那你很好。請聯繫您的系統管理員,瞭解您擁有的選項。 – hakre 2012-07-21 09:54:32

回答

0
function zipValid($path) { 
    $zip = zip_open($path); 
    if (is_resource($zip)) { 
    // valid zip 
    zip_close($zip); 
    return true; 
    } 
else 
return false; 

其他方式

  1. 您可以檢查壓縮文件的長度與其標題中的長度相反,但這可能無助於檢測損壞的文件。您需要計算該郵編的CRC碼並將其與原始的CRC進行比較以確定。 儘管原始的CRC可能不適用於您。

  2. 如果它是一個本地系統,您可以使用PHP exec函數並傳遞參數以直接使用解壓縮可執行文件。

+0

是啊,可能是我必須使用exec函數來檢查zip文件之前使用zip函數/類。 – 2012-07-22 13:59:11

+0

檢查作品的PHP方法。 exec方法只是建議作爲替代方法。如果PHP zipValid方法失敗,您可以使用它。 – 2012-07-22 14:01:05

0
function unzip($apkpath, $dirname) { 
    exec('unzip -t '.$apkpath.'>/dev/null 2>&1', $out, $return); 
    if($return === 0) 
    { 
     $zip = new ZipArchive; 
     $res = $zip->open($apkpath); 
     if ($res === TRUE) { 
      $zip->extractTo($dirname); 
      $zip->close(); 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return false; 
} 

嗯,這works.But我不認爲這是一個很好的解決方案,以提取一個zip,無論文件數據的驗證。