如何防止从zip文件中提取php文件

3
我正在使用以下代码来解压缩.zip文件。
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
   $zip->extractTo('/my/destination/dir/');
   $zip->close();
   echo 'ok';
} else {
   echo 'failed';
}

假设:在.zip文件中有一个.php文件,我不想将其解压缩。如何防止这种情况发生?

可能是使用PHP打开和创建密码保护的zip文件的重复问题。 - Parixit
1
@Parixit 这个是如何复制的? - Pedro Lobito
@PedroLobito 我认为这是关于安全压缩的问题,因为他要求不要解压缩“php”文件。 - Parixit
1
@Parixit,OP 希望从一个 zip 文件中提取 php 文件并进行过滤,就是这样。 - Pedro Lobito
1
为什么不试着防止别人运行脚本呢?也许你可以在“上传的好东西”文件夹内放置一个 .htaccess 文件,将请求重定向到一个单独的 PHP 脚本,该脚本读取文件的 URL 并使用 Content-Disposition: Attachment 返回其内容。这样,无论扩展名是什么,他们都会始终下载。 - SparK
2个回答

3
您可以尝试像这样使用PHP >= 5.5的代码:
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {

 for ($i = 0; $i < $zip->numFiles; $i++) {
     if( pathinfo($zip->getNameIndex($i)['extension'] != "php")){
        $zip->extractTo('/my/destination/dir/', $zip->getNameIndex($i));
     }
}
   $zip->close();
}

对于PHP < 5.5,可以使用以下方法:

$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {

 for ($i = 0; $i < $zip->numFiles; $i++) {
     $path_info = pathinfo($zip->getNameIndex($i));
     $ext = $path_info['extension'];
     if( $ext != "php")){
        $zip->extractTo('/my/destination/dir/', $zip->getNameIndex($i));
     }
}
   $zip->close();
}

两者唯一的区别在于 pathinfo 函数。无论哪种方式都会循环压缩文件中的所有文件,但如果文件扩展名不是 php,则会将其提取到 /my/destination/dir/

3
$zip= new ZipArchive;
if($zip->open('test.zip') === TRUE){
 for($i = 0; $i < $zip->numFiles; $i++) {
  $filename = pathinfo($zip->getNameIndex($i));
  $fileinfo = $filename['extension'];
  if($fileinfo!="php"){
    $zip->extractTo('extract/',$zip->getNameIndex($i));
  }
  $zip->close();
}

请不要仅限于提供代码片段作为答案。添加解释将使其更易读。 - Maciej Lach
你的答案和我的有什么区别?我真的不在乎你是否抄袭了我的答案,但这并不是一个好的做法。 - Pedro Lobito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接