2012-07-21 94 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,无论文件数据的验证。