当使用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=53230https://bugs.php.net/bug.php?id=57905
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都不是一个好的解决方案。
function zipValid($path) {
$zip = zip_open($path);
if (is_resource($zip)) {
// valid zip
zip_close($zip);
return true;
}
else
return false;
其他方式:
您可以根据zip文件头中的长度检查zip文件的长度,但这可能无助于检测损坏的文件。您需要计算zip的CRC,并将其与原始CRC进行比较以确定。但是,您可能无法获得原始CRC。
如果是在本地系统中执行此操作,则可以使用PHP exec函数并传递参数来直接使用解压可执行文件。