解压缩用户提交的文件的安全性

时间:2013-02-12 13:59:16

标签: php wordpress zip unzip

这里不是编码问题,而是与安全性有关的一般性问题。 我目前正在开发一个允许用户提交内容的项目。 该内容的关键部分是用户上传Zip文件。 zip文件应该只包含mp3文件。

然后我将这些文件解压缩到服务器上的一个目录中,这样我们就可以在网站上传输音频,供用户收听。

我担心的是,这会打开一些可能具有破坏性的zip文件。 我过去读过“zipbombs”,显然不希望恶意zip文件造成损坏。

那么,有没有一种安全的方法呢? 我可以扫描zip文件而不先解压缩,如果它包含MP3以外的任何内容,请删除它或向管理员发出警告吗?

如果它有所作为我在Wordpress上开发网站。 我目前使用wordpress的内置上传功能让用户将zip文件上传到我们的服务器(我不确定wordpress中是否有任何形式的安全性来扫描zip文件?)

3 个答案:

答案 0 :(得分:3)

代码,只从zip中提取MP3,忽略其他所有内容

$zip = new ZipArchive();
$filename = 'newzip.zip';

if ($zip->open($filename)!==TRUE) {
   exit("cannot open <$filename>\n");
}

for ($i=0; $i<$zip->numFiles;$i++) {
   $info = $zip->statIndex($i);
   $file = pathinfo($info['name']);
   if(strtolower($file['extension']) == "mp3") {
        file_put_contents(basename($info['name']), $zip->getFromIndex($i));
   }

}
$zip->close();

我会使用类似id3_get_versionhttp://www.php.net/manual/en/function.id3-get-version.php)的内容来确保文件的内容也是mp3

答案 1 :(得分:2)

他们是否需要将MP3压缩?除非MP3中的ID3v2信息中有很多文本框架,否则由于存储字典,文件大小会随ZIP增加。

据我所知,没有任何方法可以扫描ZIP而不实际解析它。在您通过Huffman字典运行每一位之前,数据是不透明的。你如何确定哪个文件是MP3?通过文件扩展名?按帧? MP3编码器有一个松散的标准(解码器有更严格的规格),这使得扫描文件结构很困难而没有误报。

以下是一些ZIP安全风险:

  1. 注释导致缓冲区溢出的数据。解决方案:删除评论数据。
  2. ZIP压缩大小但充气以填充文件系统(经典的ZIP炸弹)。解决方案:在充气前检查膨胀尺寸;检查字典以确保它有许多条目,并且压缩数据不是全1。
  3. 嵌套ZIP(与#2相关)。解决方案:当ZIP存档中的条目本身为ZIP数据时停止。您可以通过检查中心目录的标记来确定这一点,编号为0x02014b50(十六进制,ZIP中始终是小端 - http://en.wikipedia.org/wiki/Zip_%28file_format%29#Structure)。
  4. 嵌套目录结构,旨在超出文件系统的限制并挂起放气过程。解决方案:不要解压缩目录。
  5. 因此,要么进行大量的清理和完整性检查,要么至少使用PHP来扫描存档;检查每个文件的MP3-ness(但你这样做 - 扩展和MP3标题的存在?你不能依赖它们在字节0,但是。http://en.wikipedia.org/wiki/MP3#File_structure)和缩小的文件大小({{3 }})。如果膨胀的文件太大,或者存在任何非MP3,则退出。

答案 2 :(得分:1)

将以下代码用于.zip存档中的文件名:

$zip = zip_open('test.zip');

while($entry = zip_read($zip)) {
    $file_name = zip_entry_name($entry);
    $ext = pathinfo($file_name, PATHINFO_EXTENSION);
    if(strtoupper($ext) !== 'MP3') {
        notify_admin($file_name);
    }
}

请注意,以下代码只会查看扩展名。这意味着用户可以上传任何具有MP3扩展名的内容。要真正检查文件是否是mp3,您必须将其解压缩。我建议你在临时目录中这样做。

解压缩文件后,您可以使用,例如ffmpeg或其他任何方法对其进行分析。在任何情况下,有关比特率,跟踪长度等的详细数据都会很有趣。

如果分析失败,您可以标记文件。