2013-07-20 21 views
8

Jak mogę sprawdzić przesłanie pliku na obecność wirusa przed jego zapisaniem?Sprawdź plik do przesłania dla wirusa w MVC3

Wcześniej czytałem ten temat, ale jak mogę to zrobić programowo i zwrócić wynik dla użytkownika?

Najlepszym sposobem, aby uniknąć problemów z przesłanych przez użytkownika plików dowolnego rodzaju jest mieć wirusa skaner linii komend na serwerze, którego używasz do skanować pliki po przesłaniu. Jeśli wynik skaner jest pozytywny, należy usunąć plik i tak dalej

+0

Witam, zastanawiałam się, czy mógłbyś się podzielić tym, jak udało Ci się to sprawić i które rozwiązanie najlepiej Ci posłużyło? –

+1

Możesz użyć interfejsu API IAttachmentExecute. [Ta odpowiedź może ci pomóc] (http://stackoverflow.com/a/35684198/1442180) – Fred

+0

Możesz użyć API IAttachmentExecute. [Ta odpowiedź może ci pomóc] (http: // stackoverflow.com/a/35684198/1442180) – Fred

Odpowiedz

7

Spójrz na Sophos API https://secure.sophos.com/partners/oem/integration/savdi.html

„SAV dynamiczny interfejs (SAVDI) zapewnia łatwy do zintegrowania interfejs ogólnego przeznaczenia do mechanizmu wykrywania Sophos, który umożliwia programom napisanym w dowolnym języku skanowanie plików i danych pod kątem złośliwego oprogramowania i jest szczególnie popularny wśród dostawców usług internetowych/ASP działających w środowisku .NET. "

Inną alternatywą jest użycie klasy Proces, aby uruchomić skaner antywirusowy na serwerze (http://www.dotnetperls.com/process-start) i przeanalizować jego wyniki. Na przykład tutaj jest lista parametrów wiersza polecenia dla AVG: http://www.avg.com/ww-en/faq.num-3604.

Przy okazji, podczas opracowywania rozwiązania konieczne będzie sprawdzenie, czy jesteś w stanie zidentyfikować zainfekowany plik. Ale nie zaleca się używania prawdziwego zainfekowanego pliku. Możesz jednak utworzyć plik tekstowy z poniższym łańcuchem. Ten ciąg jest zwykle identyfikowany przez skanery antywirusowe jako zainfekowany plik do celów testowych (aby uzyskać więcej informacji, wyszukaj standardowy plik testowy antywirusowy EICAR).

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

2

spróbować zasobów internetowych do skanowania jak virusTotal lub podobny. Również wiem, że Kaspersky posiada skaner online, ale jest tymczasowo niedostępny.

Z punktu widzenia aplikacji można stworzyć serwer proxy, gdzie można zainstalować oprogramowanie antywirusowe, przesłać plik z tym serwerem, zeskanować i przesłać do serwera docelowego

+1

Jeśli to zrobisz, pamiętaj, aby sprawdzić TOS witryny, to jest tak, jak oni nie pozwalają na użycie tego typu (przynajmniej nie za darmo, mogą mieć komercyjną usługę, za którą możesz zapłacić) –

+0

To dobra opcja, ale w przypadku plików trwających kilka godzin, aby skanować, jest mniej skuteczna w formularzu przesłanym na stronie internetowej ... –

3

Aby ułatwić sobie życie ... po prostu sprawdź Metascan Online. Oferują darmowy publiczny interfejs internetowy. W przyszłości można również skonfigurować sposób programowania programowego za pomocą publicznego interfejsu API Metascan Online.

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); 

To jest silnik, którego chcesz używać, jeśli poważnie myślisz o skanowaniu wielostanowiskowym. Używają też ponad 40 silników do skanowania plików.

1

Szukałem rozwiązania bardzo podobnego problemu i nie znalazłem zbyt wiele w skanowaniu pamięci. Większość znalezionych przykładów dotyczy zapisania pliku na dysk, a następnie skanowania poprzez przekazanie niektórych zmiennych do innego procesu w celu przeskanowania pliku na dysku.

Tak więc w rozwiązaniu, którego używałem, po prostu używam HttpPostedFileBase.InputStream i wysyłam to do ClamAv, aby zeskanować. Nie ma zbyt wiele kodu, aby działało w MVC i jego QED.

Więc w kontroler MVC, musisz coś takiego:

/// 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); 
    } 
} 

Realizacja VirusScannerFactory może być przedłużony do swoich sprzedawca 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); 
} 

Jako przykład posłużyłem nClam i ClamAv. Pełne wdrożenie ClamAV może być found on github, ale urywek jak dostać pracy dla pamięci strumieni jest poniżej

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; 
    } 
} 

stworzyłem blog post z pełnymi szczegółami, jak to zrobić z ClamAV.

+3

Należy unikać odpowiedzi, które są głównie odnośnikami do innych witryn, ponieważ stają się mniej przydatne, gdy URL porusza się/umiera /itp. Czy możesz edytować niektóre odpowiednie fragmenty ze swojego bloga w swojej odpowiedzi? –

1

Czy jakieś badania na ten temat, tutaj jest podsumowanie. (Jest to przede wszystkim dla systemu Windows i C#, jak używam Windows i używamy Symantec oprogramowania antywirusowego)

  1. Symantec produkt:

    a. System Scan Engine. : To jest jak prywatna usługa antywirusowa i zapewnia SDK do integracji z systemem.

    b. Doscan.exe: to narzędzie wiersza poleceń, które można znaleźć w systemie naszej firmy. Możemy użyć w naszym kodzie, tworząc nowy proces skanowania pliku. Urządzenie to wykorzystuje ten sam proces skanowania skanera Symantec. Zostanie zablokowany , gdy program będzie długo skanował.

  2. AntiVirusscanner

    Ta biblioteka jest opakowaniem anty wirus oprogramowania (takich jak "Microsoft Security Essentials (Windows Defender)") którego zainstalowany w systemie operacyjnym Windows. Ponieważ nie mogę zatrzymać skanowania w czasie rzeczywistym programu Symantec na moim komputerze, więc nie wiem, czy to działa. Zauważyłem, że użytkownik powiedział, że to nie działa, ale nie sprawdziłem.

  3. Windows Defender:

    To jest wbudowany w systemie operacyjnym Windows oprogramowanie antywirusowe. I mówi się, że ma narzędzie wiersza polecenia (mpcmdrun.exe), ale nie mogę znaleźć go na moim komputerze. I został wyłączony, ponieważ używamy Symantec. Jeśli masz, możesz spróbować.

  4. Open Source Antywirusowe produkt

    ClamAV jest popularna. Niektóre produkty integrują je z ich systemem. Ma też API C#, dzięki czemu można go również używać do tworzenia prywatnego silnika skanowania w chmurze.

  5. Komercyjne skanowanie silnika otwarte API jak: Virustotal i Sophos.