这里不是编码问题,而是与安全性有关的一般性问题。 我目前正在开发一个允许用户提交内容的项目。 该内容的关键部分是用户上传Zip文件。 zip文件应该只包含mp3文件。
然后我将这些文件解压缩到服务器上的一个目录中,这样我们就可以在网站上传输音频,供用户收听。
我担心的是,这会打开一些可能具有破坏性的zip文件。 我过去读过“zipbombs”,显然不希望恶意zip文件造成损坏。
那么,有没有一种安全的方法呢? 我可以扫描zip文件而不先解压缩,如果它包含MP3以外的任何内容,请删除它或向管理员发出警告吗?
如果它有所作为我在Wordpress上开发网站。 我目前使用wordpress的内置上传功能让用户将zip文件上传到我们的服务器(我不确定wordpress中是否有任何形式的安全性来扫描zip文件?)
答案 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_version
(http://www.php.net/manual/en/function.id3-get-version.php)的内容来确保文件的内容也是mp3
答案 1 :(得分:2)
他们是否需要将MP3压缩?除非MP3中的ID3v2信息中有很多文本框架,否则由于存储字典,文件大小会随ZIP增加。
据我所知,没有任何方法可以扫描ZIP而不实际解析它。在您通过Huffman字典运行每一位之前,数据是不透明的。你如何确定哪个文件是MP3?通过文件扩展名?按帧? MP3编码器有一个松散的标准(解码器有更严格的规格),这使得扫描文件结构很困难而没有误报。
以下是一些ZIP安全风险:
因此,要么进行大量的清理和完整性检查,要么至少使用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或其他任何方法对其进行分析。在任何情况下,有关比特率,跟踪长度等的详细数据都会很有趣。
如果分析失败,您可以标记文件。