在MVC3中检查上传文件中的病毒

时间:2013-07-20 17:53:31

标签: asp.net-mvc-3 c#-4.0 file-upload virus-scanning

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

我以前读过这个主题,但我怎么能以编程方式为用户做回报?

  

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

等文件

5 个答案:

答案 0 :(得分:7)

查看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 **

答案 1 :(得分: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多个引擎来扫描文件。

答案 2 :(得分:2)

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

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

答案 3 :(得分: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执行此操作的完整详细信息。

答案 4 :(得分:1)

对此主题进行了一些研究,这里是摘要。(主要针对Windows和C#,因为我使用的是Windows,我们使用的是赛门铁克防病毒软件)

  1. 赛门铁克产品

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

    湾Doscan.exe:它是我在公司系统中可以找到的命令行工具。我们可以通过创建扫描文件的新进程在我们的代码中使用它。它 使用Symantec扫描程序的相同扫描过程。所以它会被阻止 当软件长时间扫描时。

  2. <强> AntiVirusscanner

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

  3. Windows Defender

    它是一个内置Windows系统的防病毒软件。和 据说它有一个推荐线工具(mpcmdrun.exe),但我不能 在我的机器上找到它。它因我们使用赛门铁克而被禁用。如果你有它,你可以尝试一下。

  4. 开源反病毒产品

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

  5. 商业扫描引擎Open API ,如: Virustotal和Sophos。