7

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

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

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

那么,有没有一种安全的方法来做到这一点?我可以在不先解压缩的情况下扫描 zip 文件吗?如果它包含 MP3 以外的任何内容,请将其删除或向管理员发出警告?

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

4

3 回答 3

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

于 2013-02-12T14:15:06.490 回答
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. 嵌套目录结构,旨在超出文件系统的限制并挂起放气过程。解决方案:不要解压目录。

因此,要么进行大量的清理和完整性检查,要么至少使用 PHP 来扫描存档;检查每个文件的 MP3 特性(但是你这样做 - 扩展名和 MP3 标题的存在?但你不能依赖它们位于字节0。http ://en.wikipedia.org/wiki/MP3# File_structure)和缩小的文件大小(http://www.php.net/manual/en/function.zip-entry-filesize.php)。如果膨胀的文件太大,或者存在任何非 MP3,请退出。

于 2013-02-12T14:29:24.443 回答
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 或其他工具对其进行分析。在任何情况下,拥有有关比特率、轨道长度等的详细数据都会很有趣。

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

于 2013-02-12T14:07:29.293 回答