2013-07-20 45 views
8

如何在存储之前检查病毒的上传文件?检查MVC3中病毒的上传文件

我以前读过这个话题,但是我该如何编程并返回用户的结果呢?

,以避免任何形式的用户上传的文件的问题,最好的办法是 有服务器上的命令行病毒扫描程序,您可以使用它 扫描文件后上传。如果扫描仪结果为阳性,删除 文件等

+0

嗨,我想知道你是否可以分享你如何设法使这个工作,以及你最好使用哪种解决方案? –

+1

您可以使用IAttachmentExecute API。 [这个答案你可以帮助你](http://stackoverflow.com/a/35684198/1442180) – Fred

+0

你可以使用IAttachmentExecute API。 [这个答案你可以帮助你](http:// stackoverflow。com/a/35684198/1442180) – Fred

回答

7

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

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

另一种替代方法是使用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或类似。 也据我所知卡巴斯基有一个在线扫描仪,但它暂时不可用。

从应用的角度来看,你可以创建一个代理服务器,在那里你可以安装杀毒软件,上传文件到该服务器,扫描,并传送到目标服务器

+1

如果你这样做,一定要检查网站的服务条款,这是因为他们不允许这样使用(至少不是免费的,他们可能有商业服务,你可以支付) –

+0

这是一个很好的选择,但对于需要扫描几个小时的文件,它在提交表单的网站上效率较低... –

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多个引擎来扫描文件。

1

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

因此,在我使用的解决方案中,我只使用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,但你如何得到它的工作内存流的片段低于

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的做的全部细节。

+3

请避免主要链接到其他网站的答案,因为如果URL移动/死亡/等等。你可以从你的博客编辑一些相关的摘录到你的答案吗? –

1

难道这个话题的一些研究,这里是总结。(主要是Windows和C#,因为我使用的是Windows和我们使用的是Symantec防病毒软件)

  1. 赛门铁克产品

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

    b。 Doscan.exe:它是我可以在我们公司的系统中找到的命令行工具。我们可以通过创建一个新的进程来扫描文件,从而在我们的代码中使用。它 使用与Symantec扫描仪相同的扫描进程。所以当软件进行很长时间的扫描时,它将被阻止 。

  2. AntiVirusscanner

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

  3. Windows Defender的

    这是一个反病毒软件内置的Windows系统。并且 据说有一个名为line tool的工具(mpcmdrun.exe),但是我不能在我的机器上找到它 。它在我们使用Symantec时被禁用。如果你有它,你可以试试看。

  4. 开源反病毒产品

    ClamAV的是一个受欢迎的一个。一些 产品将其整合到他们的系统中。它具有C#API,因此它可以用 制作私有云扫描引擎。

  5. 商业扫描引擎开放API像: Virustotal和Sophos。