在 MVC3 中检查上传文件是不是有病毒

Posted

技术标签:

【中文标题】在 MVC3 中检查上传文件是不是有病毒【英文标题】:Check upload file for virus in MVC3在 MVC3 中检查上传文件是否有病毒 【发布时间】:2013-07-19 20:33:15 【问题描述】:

如何在存储之前检查上传文件是否有病毒?

我以前读过这个主题,但是我怎样才能编程并为用户返回结果?

避免用户上传的任何类型文件出现问题的最佳方法是 在服务器上安装命令行病毒扫描程序,您可以使用它 上传后扫描文件。如果扫描仪结果是肯定的,删除 文件等

【问题讨论】:

您好,我想知道您能否分享一下您是如何做到这一点的,以及您认为哪种解决方案最适合使用? 您可以使用 IAttachmentExecute API。 This answer you can help you 您可以使用 IAttachmentExecute API。 This answer you can help you 【参考方案1】:

看看 Sophos API https://secure.sophos.com/partners/oem/integration/savdi.html

“SAV 动态接口 (SAVDI) 为 Sophos 检测引擎提供了一个易于集成的通用接口。它使以任何语言编写的程序能够扫描文件和数据中的恶意软件,特别受 ISP/ASP 的欢迎在 .NET 环境中运行。”

另一种方法是使用 Process 类在服务器 (http://www.dotnetperls.com/process-start) 上启动反病毒扫描程序并解析其结果。例如,下面是 AVG 的命令行参数列表:http://www.avg.com/ww-en/faq.num-3604。

顺便说一下,在开发解决方案时,您需要测试是否能够识别受感染的文件。但不建议使用真正的受感染文件。但是,您可以使用以下字符串创建一个文本文件。该字符串通常被防病毒扫描程序识别为受感染文件以进行测试(有关详细信息,请搜索 EICAR 标准防病毒测试文件)。

*X5O!P%@AP[4\PZX54(P^)7CC)7$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H**

【讨论】:

【参考方案2】:

尝试在线资源进行扫描,例如 virusTotal 或类似的。 另外据我所知,卡巴斯基有一个在线扫描仪,但暂时不可用。

从应用程序的角度来看,您可以创建一个代理服务器,您可以在其中安装防病毒软件,将文件上传到此服务器,扫描并传输到您的目标服务器

【讨论】:

如果您这样做,请务必查看网站的 TOS,他们可能不允许这样使用(至少不是免费的,他们可能有您可以付费购买的商业服务)跨度> 这是一个不错的选择,但是文件扫描需要几个小时,在网站提交的表单中效果较差...【参考方案3】:

为了让您的生活更轻松...只需查看 Metascan Online。他们提供在线免费的公共 API。将来,您还可以使用 Metascan Online 公共 API 设置一种以编程方式执行此操作的方法。

    Sample Code(php)

       // Config.
        $api    = 'https://api.metascan-online.com/v1/file';
        $apikey = 'E1D7-DG5E-4FE0-BFAE';
        $file   = 'test.txt';

      // Build headers array.
      $headers = array(
  'apikey: '.$apikey,
  'filename: '.basename($file)
      );

      // Build options array.
      $options = array(
  CURLOPT_URL       => $api,
  CURLOPT_HTTPHEADER    => $headers,
  CURLOPT_POST      => true,
  CURLOPT_POSTFIELDS    => file_get_contents($file),
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_SSL_VERIFYPEER    => false
      );

      // Init & execute API call.
      $ch = curl_init();
      curl_setopt_array($ch, $options);
      $response = json_decode(curl_exec($ch), true);

      print_r($response);

如果您非常重视多重扫描,这就是您想要使用的引擎。他们还使用 40 多个引擎来扫描文件。

【讨论】:

【参考方案4】:

我正在寻求解决一个非常相似的问题,但在内存扫描方面没有发现太多。我发现的大多数示例都涉及将文件写入磁盘,然后通过将一些变量传递给另一个进程来扫描磁盘上的文件。

所以在我使用的解决方案中,我只使用HttpPostedFileBase.InputStream,然后将其发送给 ClamAv 进行扫描。没有太多代码可以让它在 MVC 及其 QED 中工作。

所以在你的 MVC 控制器中,你会有这样的东西:

/// Main controller
public class HomeController : Controller 

    /// Get the upload view
    [HttpGet]
    public ActionResult Index() 
        return View();
    

    /// Handle the file upload
    [HttpPost]
    public ActionResult Index(UploadViewModel model, HttpPostedFileBase file) 
        var scanner = VirusScannerFactory.GetVirusScanner();
        var result = scanner.ScanStream(file.InputStream);

        if(result.IsVirusFree) 
            // save to disk
         else 
            // don't save to disk and tell user they uploaded a virus
        

        return View(model);
    

VirusScannerFactory 的实现可以扩展以适应您的 AV 供应商。

public class VirusScannerFactory 
    public static IScanViruses GetVirusScanner() 
        //Currently we only have one Antivirus implementation, 
        //but later we want to include AVG, SOPHOS and metascan 
        return new ClamAvScanner();
    


public interface IScanViruses 

    ScanResult ScanFile(string fullPath);

    ScanResult ScanBytes(byte[] bytes);

    ScanResult ScanStream(Stream stream);

我以 nClam 和 ClamAv 为例。完整的 ClamAv 实现可以是 found on github,但下面是关于如何让它为内存流工作的 sn-p

public class ClamAvScanner : IScanViruses
    ... snip ...
    /// Scans your data stream for virus
    public ScanResult ScanStream(Stream stream) 
        var clam = new ClamClient("localhost", 3310);
        return MapScanResult(clam.SendAndScanFile(stream));
    
    ...snip ...
    /// helper method to map scan result
    private ScanResult MapScanResult(ClamScanResult scanResult) 
        var result = new ScanResult();
        switch (scanResult.Result) 
            case ClamScanResults.Unknown:
                result.Message = "Could not scan file";
                result.IsVirusFree = false;
            break;
            case ClamScanResults.Clean:
                result.Message = "No Virus found";
                result.IsVirusFree = true;
                break;
            case ClamScanResults.VirusDetected:
                result.Message = "Virus found: " + scanResult.InfectedFiles.First().VirusName;
                result.IsVirusFree = false;
                break;
            case ClamScanResults.Error:
                result.Message = string.Format("VIRUS SCAN ERROR! 0", scanResult.RawResult);
                result.IsVirusFree = false;
                break;
           
        return result;
    

我创建了一个blog post,详细说明了如何使用 ClamAv 执行此操作。

【讨论】:

请避免主要是指向其他网站的链接的答案,因为如果 URL 移动/死亡/等,它们会变得不那么有用。您可以将博客中的一些相关摘录编辑成您的答案吗?【参考方案5】:

对这个话题做了一些研究,这里是总结。(主要针对Windows和C#,因为我用的是Windows,我们用的是赛门铁克杀毒软件)

    赛门铁克产品

    一个。 Systemtec 扫描引擎。 : 就像私人的 防病毒服务,并提供 SDK 集成到您的系统中。

    b. Doscan.exe :这是我在我们公司系统中可以找到的命令行工具。我们可以通过创建一个新进程来扫描文件的方式在我们的代码中使用。它 使用与赛门铁克扫描仪相同的扫描过程。所以会被屏蔽 当软件进行长时间扫描时。

    反病毒扫描仪

    该库是反病毒软件产品的包装(如 “Microsoft Security Essentials (Windows Defender)”) 安装在您的 Windows 操作系统上。因为我无法停止实时扫描 我机器上的赛门铁克,所以不知道它是否有效。我发现一个用户说它不起作用但我没有检查。

    Windows Defender

    它是一款内置于Windows系统的杀毒软件。和 据说有一个推荐行工具(mpcmdrun.exe),但我不能 在我的机器上找到它。当我们使用赛门铁克时,它被禁用了。有的话可以试试看。

    开源防病毒产品

    ClamAV 很受欢迎。一些 产品将其集成到他们的系统中。它有 C# API,所以它可以 也可用于制作私有云扫描引擎。

    商业扫描引擎开放 API 如: Virustotal 和 Sophos。

【讨论】:

以上是关于在 MVC3 中检查上传文件是不是有病毒的主要内容,如果未能解决你的问题,请参考以下文章

在上传 Amazon S3 之前检查病毒? [关闭]

前端防病毒扫描文件上传

Firebase 存储病毒检查

用于上传文件的防病毒扫描[关闭]

如何在 asp.net c# 中检查病毒扫描的结果?

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