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.
fonte
2015-09-02 20:20:49
Ciao, mi chiedevo se potevi condividere come sei riuscito a farlo funzionare e quale soluzione hai trovato migliore da usare? –
È possibile utilizzare l'API IAttachmentExecute. [Questa risposta ti può aiutare] (http://stackoverflow.com/a/35684198/1442180) – Fred
Puoi utilizzare l'API IAttachmentExecute. [Questa risposta ti può aiutare] (http: // StackOverflow.it/a/35684198/1442180) – Fred