我有一个 Mac 服务器,我正在构建 PHP 代码以允许用户上传图像、文档甚至视频文件。研究这个肯定让我很紧张,我希望上传的内容没有病毒。
自己建造东西会是一个巨大的挑战吗?你会这样做,还是会找到一些 OS 或 OTS 产品?(你知道有什么可以推荐的吗)?
从概念上讲,您所说的非常简单。接受和处理上传非常简单,我认为您绝对不需要担心购买预构建的解决方案。
一般来说,图像和视频之类的东西不可能真的有“病毒”(除非查看器应用程序真的很差,并且让它们以某种方式运行代码 - 也称为“Internet Explorer”),但无论如何对它们进行病毒扫描并不难你愿意。只需找到一个可以在服务器上运行的命令行扫描程序(例如Clam AV),每当上传文件时,通过扫描程序运行它,如果扫描失败则拒绝上传(并记录事件)。
如果您要上传非常大的文件,您还可以考虑使用 Flash 上传/状态栏,以便用户可以查看上传了多少文件。SWFUpload是一个不错的选择。
您可以通过在 PHP 中执行以下操作来使用 ClamAV 扫描文件:
$out = '';
$int = -1;
exec('/usr/local/bin/clamscan --stdout /path/to/file.ext', $out, $int);
if ($int == 0)
{
print('No virus!');
}
/*
Return codes from clamscan:
0 : No virus found.
1 : Virus(es) found.
40: Unknown option passed.
50: Database initialization error.
52: Not supported file type.
53: Can't open directory.
54: Can't open file. (ofm)
55: Error reading file. (ofm)
56: Can't stat input file / directory.
57: Can't get absolute path name of current working directory.
58: I/O error, please check your file system.
59: Can't get information about current user from /etc/passwd.
60: Can't get information about user '' from /etc/passwd.
61: Can't fork.
62: Can't initialize logger.
63: Can't create temporary files/directories (check permissions).
64: Can't write to temporary directory (please specify another one).
70: Can't allocate memory (calloc).
71: Can't allocate memory (malloc).
*/
简短的回答:不要买任何东西。您从自己编写代码中获得的经验和成就感更值得。
长答案:信任任何形式的用户输入通常是一个坏主意。但是,明智地处理用户数据始终是最好的方法。如果你不做傻事*,你会没事的,你会从经验中获益良多。
(*我知道这有点模棱两可,但是,嘿,在你犯错之前尝试识别错误。我知道我很少能做到。;)
我现在正在使用来自 digitarald 的 FancyUpload 为 Mootools 1.2.1 构建类似的东西
检查这个例子:http://localhost/fancyupload/showcase/photoqueue/看看它有多酷。
只需确保您阅读了如何将会话传递给 Flash(使用 GET / POST 参数!您的会话 cookie 将不起作用。)并对文件类型进行一些检查。
就个人而言,我不会让我的用户上传视频。只需使用 youtube 并嵌入这些东西。
哦,是的,如果您想要上传的内容的缩略图,请在您的服务器上安装 ImageMagick 和 Ghostscript。Imagemagick 甚至可以从 PDF 生成缩略图!
“我自己建造东西会是一个巨大的挑战吗?” 是的。没有将其外包给第三方解决方案那么大,但是您想要在这里编码的可能是您可以在 php Web 脚本上编码的最危险的事情:允许用户将文件上传到您的服务器。您需要非常小心地过滤您要接受的文件,以防止用户将 php 脚本上传到您的服务器。人们在过滤时常犯的错误是:
我可以继续,但我想你在问之前已经害怕了:)
根据病毒问题,是的,只需运行 AV。
这是处理上传文件的代码,只是为了让您明白:
foreach ($_FILES as $file) {
if (!$file['error']) {
move_uploaded_file ($file['tmp_name'], 'uploads/'. $file['name']);
} elseif (4 != $file['error']) {
$error_is = $file['error'];
// do something with the error :-)
}
}
header ('Location: ...'); // go to the updated page, like, with the new files
die;
您最好使用第三方病毒扫描程序来确保上传没有病毒。(编写自己的代码来检查病毒听起来像是一项艰巨的任务)
示例:我认为 Gmail 使用的是 Norton,而 Yahoo!Mail 我认为使用的是 McAfee。
Keith Palmer 建议使用小脚本。
使用clamdscan而不是 clamscan。clamdscan 与 setup clamd(clamav 守护程序)通信,而 clamscan 是一个独立的应用程序,因此每次调用它都会加载病毒签名,这可能会在您的服务器上产生相当大的负载。
此外,您还可以尝试 clamuko(这可以让您进行访问扫描),因此您可以将文件放入 clamuko 观察到的目录中。
如果您不能将模块插入内核,还有基于 FUSE 的 ClamFS 可能是更好的解决方案。