扫描 PHP 上传的病毒

Posted

技术标签:

【中文标题】扫描 PHP 上传的病毒【英文标题】:Scan PHP uploads for viruses 【发布时间】:2010-10-13 23:36:21 【问题描述】:

我目前正在使用以下代码扫描已作为申请表的一部分上传的文件:

$safe_path = escapeshellarg($dir . $file);
$command = '/usr/bin/clamscan --stdout ' . $safe_path;
$out = '';
$int = -1;
exec($command, $out, $int);

if ($int == 0) 
    // all good;
 else 
    // VIRUS!;

它可以工作,但速度很慢。任何人都有任何建议a)。加快速度和b)。总体改进脚本(例如,我不完全清楚 exec() 与 system() 等的好处)?

如果速度无法提高,那么我最好显示一些临时的“请耐心等待您的文件正在被扫描”消息,但我也不知道该怎么做。

编辑:对不起,应该说需要在当时进行扫描,因为如果没有有效(即无病毒)文件,将不会接受相关应用程序。

【问题讨论】:

那么我相信我的答案中的第二个选项可以做到...显示一个临时页面说“请稍候...”并通过 AJAX 或元刷新标签获取结果。 干杯 Seb,我认为您可能是正确的。我会坚持更长的时间,希望有人知道加速clamscan的一些事情...... 对于任何在家里跟随的人,我最终使用 jQuery blockUI 来显示“请耐心等待”消息,所以虽然我将他的回答标记为已接受,但与 Seb 的建议并不完全一致,因为这很好一。干杯。 【参考方案1】:

如果您不需要立即向用户显示结果,您可以将文件添加到数据库表中以便稍后扫描。

然后,您可以创建一个新进程来扫描和更新表中的结果。你有一个很好的例子:http://robert.accettura.com/blog/2006/09/14/asynchronous-processing-with-php/。

如果你绝对需要在同一个请求中显示结果,那么你可以完全按照我之前说的那样做,但是通过 AJAX 输出一个请求结果的临时页面;扫描结束后,将用户重定向到结果页面。

如果您不想使用 javascript,那么一个简单的元刷新标签就可以解决问题。

【讨论】:

【参考方案2】:

设置一个单独的应用程序,最好是在一个不同的盒子上,您可以在其中批量扫描这些扫描。该框可以将其状态更新到数据库中,您的前端服务可以在其中读取并向用户报告。

【讨论】:

【参考方案3】:

使用 clamdscan 代替 clamscan。 Clamdscan 使用始终运行的内置守护程序,不必每次都加载病毒表(如 clamscan 所做的那样)。

【讨论】:

【参考方案4】:

为了保持最新:现在有一个 PHP 库正在使用与 ClamAV 的套接字连接并通过 PHP 快速初始化文件扫描。

https://github.com/jonjomckay/quahog

请务必使用正确的权限,因为扫描将由 clamav 用户完成,而不是 www-data。

【讨论】:

以上是关于扫描 PHP 上传的病毒的主要内容,如果未能解决你的问题,请参考以下文章

文件上传必须在病毒扫描之前存储吗?

前端防病毒扫描文件上传

对 Azure 网站上上传的文件进行病毒扫描

如何在 Spring 3 MVC 应用程序中对文件上传进行病毒扫描[关闭]

将文件上传到正在运行实时防病毒扫描的服务器

如何对上传到 AWS S3 的文件执行自动病毒扫描