2

php zipクラスを使用してzipファイルを抽出する場合(実際には悪いですが、誰が知っていますか?)、

  $ 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、または他の拡張子の置換を安全に使用する方法、またはzipファイルが有効であることを確認する方法を知っている人はいますか? さらに、私はphp5.3.14+ubuntuを使用しています。
そして、私はそこで知ってい ます、 https ://bugs.php.net/bug.php?id = 53230 https://bugs.php.net/bug.php?id=57905

4

2 に答える 2

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;
}

まあ、それは機能しますが、ファイルデータの検証に関係なく、zipを抽出するのは良い解決策ではないと思います。

于 2012-07-22T13:57:25.487 に答える
0
function zipValid($path) {
  $zip = zip_open($path);
  if (is_resource($zip)) {
    // valid zip
    zip_close($zip);
    return true;
  }
else 
return false;

他の方法:

  1. zip ファイルの長さをヘッダーの長さと比較して確認できますが、破損したファイルの検出には役立たない場合があります。確実に知るには、zip の CRC を計算し、それを元の CRC と比較する必要があります。ただし、元の CRC は利用できない場合があります。

  2. これを実行しているローカル システムの場合は、PHP exec関数を使用し、引数を渡して unzip 実行可能ファイルを直接使用できます。

于 2012-07-21T10:14:07.757 に答える