2013-07-20 13 views
8

Come posso controllare il file di caricamento del virus prima di memorizzarlo?Controllare il file di caricamento del virus in MVC3

Ho letto in precedenza questo argomento, ma come posso farlo programmatico e restituire il risultato per l'utente?

Il modo migliore per evitare problemi con i file caricati dall'utente di qualsiasi tipo è di avere un programma antivirus a riga di comando sul server, che si usa per la scansione dei file dopo il caricamento. Se il risultato dello scanner è positivo, eliminare il file e così via

+0

Ciao, mi chiedevo se potevi condividere come sei riuscito a farlo funzionare e quale soluzione hai trovato migliore da usare? –

+1

È possibile utilizzare l'API IAttachmentExecute. [Questa risposta ti può aiutare] (http://stackoverflow.com/a/35684198/1442180) – Fred

+0

Puoi utilizzare l'API IAttachmentExecute. [Questa risposta ti può aiutare] (http: // StackOverflow.it/a/35684198/1442180) – Fred

risposta

7

Date un'occhiata a Sophos API https://secure.sophos.com/partners/oem/integration/savdi.html

"SAV dinamica Interface (SAVDI) fornisce un facile da integrare, interfaccia general-purpose al motore di rilevamento di Sophos, che consente ai programmi scritti in qualsiasi linguaggio di eseguire la scansione di file e dati per malware ed è particolarmente popolare con gli ISP/ASP in esecuzione in ambiente .NET. "

Un'altra alternativa è utilizzare la classe Process per avviare uno scanner antivirus sul server (http://www.dotnetperls.com/process-start) e analizzare i relativi risultati. Ad esempio, ecco l'elenco dei parametri della riga di comando per AVG: http://www.avg.com/ww-en/faq.num-3604.

A proposito, mentre sviluppi la soluzione, dovrai verificare se sei in grado di identificare un file infetto. Ma non è raccomandato l'uso di un vero file infetto. Tuttavia, puoi creare un file di testo con la stringa seguente. Questa stringa viene comunemente identificata dagli scanner anti-virus come un file infetto a scopo di test (per ulteriori informazioni, cercare il file di test anti-virus EICAR standard).

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

2

cercare risorse online per la scansione come virusTotale o simile. Anche perché so che Kaspersky ha uno scanner online, ma è temporaneamente non disponibile.

Dal punto di vista applicativo è possibile creare un server proxy in cui è possibile installare un software antivirus, caricare il file su questo server, eseguire la scansione e trasferirli sul server di destinazione

+1

Se lo fai, assicurati di controllare i TOS del sito, è come se non ne consentissero l'uso (almeno non gratuitamente, potrebbero avere un servizio commerciale che puoi pagare) –

+0

Questa è una buona opzione, ma con i file che richiedono diverse ore di scansione, è meno efficace in un modulo inviato dal sito Web ... –

3

Per rendere la vita più facile ... basta controllare Metascan Online. Offrono un'API pubblica gratuita online. In futuro, potresti anche impostare un modo per farlo a livello di codice con l'API pubblica di 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); 

Questo è il motore che si desidera utilizzare se siete serio circa Multi -scanning. Inoltre, usano oltre 40 motori per scansionare i file.

1

Stavo cercando di risolvere un problema molto simile e non ho trovato molto in memoria. La maggior parte degli esempi che ho riscontrato riguardano la scrittura del file su disco, e quindi la scansione passando alcune variabili a un altro processo per eseguire la scansione del file su disco.

Quindi nella soluzione che ho usato uso solo lo HttpPostedFileBase.InputStream e lo invio a ClamAv per eseguire la scansione. Non c'è molto codice per farlo funzionare in MVC e il suo QED.

Così nel controller MVC, avrete qualcosa di simile:

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

L'attuazione del VirusScannerFactory può essere estesa a internet il fornitore 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); 
} 

Ho usato nClam e ClamAv come esempio. L'implementazione completa ClamAV può essere found on github, ma un frammento di come si ottiene a lavorare per la memoria flussi è al di sotto

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

Ho creato un blog post con tutti i dettagli su come fare questo con ClamAV.

+3

Si prega di evitare le risposte che sono principalmente collegamenti ad altri siti, in quanto diventano meno utili se l'URL si muove/muore /eccetera. Puoi modificare alcuni estratti rilevanti del tuo blog nella tua risposta? –

1

fatto qualche ricerca su questo argomento, qui è la sintesi. (E 'principalmente per Windows e C#, come io sto usando Windows e stiamo usando un software anti-virus Symantec)

  1. Symantec prodotto:

    a. Systemtec Scan Engine. : È come un servizio antivirus privato e fornisce l'SDK per l'integrazione nel sistema.

    b. Doscan.exe: è uno strumento a riga di comando che posso trovare nel sistema della nostra azienda. Possiamo usare nel nostro codice creando un nuovo processo per scansionare un file. Lo utilizza lo stesso processo di scansione dello scanner Symantec. Quindi sarà bloccato quando il software sta eseguendo una lunga scansione.

  2. AntiVirusscanner

    Questa libreria è un wrapper di prodotto anti software antivirus (ad esempio "Microsoft Security Essentials (Windows Defender)"), che si installato sul sistema operativo Windows. Poiché non riesco a fermare la scansione in tempo reale di Symantec sulla mia macchina, quindi non so se funziona. Ho trovato un utente che ha detto che non funziona ma non ho controllato.

  3. Windows Defender:

    Si tratta di un software anti-virus build-in di sistema di Windows. E si dice che abbia uno strumento di linea di comando (mpcmdrun.exe), ma non riesco a trovarlo nella mia macchina. Ed è stato disabilitato mentre stiamo usando Symantec. Se ce l'hai puoi provarlo.

  4. Open Source antivirus prodotto

    ClamAV è una popolare. Alcuni prodotti si integrano nel loro sistema. E ha C# API, quindi può anche essere utilizzato per creare un motore di scansione del cloud privato con .

  5. API di Scan-Engine commerciale Open come: Virustotal e Sophos.