首页 文章

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

提问于
浏览
8

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

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

避免用户上传任何类型文件问题的最佳方法是在服务器上安装命令行病毒扫描程序,用于在上载后扫描文件 . 如果扫描仪结果为正,则删除文件,依此类推

5 回答

  • 1

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

    “SAV动态接口(SAVDI)为Sophos检测引擎提供了易于集成的通用接口 . 它使用任何语言编写的程序能够扫描文件和数据以查找恶意软件,并且特别受到运行在ISP中的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

    为了让您的生活更轻松...只需查看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多个引擎来扫描文件 .

  • 7

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

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

  • 3

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

    所以在我使用的解决方案中,我只使用 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执行此操作 .

  • 2

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

    • Symantec product

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

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

    • AntiVirusscanner

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

    • Windows Defender

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

    • Open Source Anti-virus product

    ClamAV是一个受欢迎的 . 有些产品将它集成到他们的系统中 . 它有C#API,因此它也可以用来制作私有 Cloud 扫描引擎 .

    • Commercial Scan-Engine Open API 喜欢:Virustotal和Sophos .

相关问题