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.
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? –
Możesz użyć interfejsu API IAttachmentExecute. [Ta odpowiedź może ci pomóc] (http://stackoverflow.com/a/35684198/1442180) – Fred
Możesz użyć API IAttachmentExecute. [Ta odpowiedź może ci pomóc] (http: // stackoverflow.com/a/35684198/1442180) – Fred