如何在存储之前检查上传文件是否有病毒?
我以前读过这个主题,但我怎样才能以编程方式进行并为用户返回结果?
避免用户上传的任何类型文件出现问题的最佳方法是在服务器上安装命令行病毒扫描程序,用于在上传后扫描文件。如果扫描仪结果是肯定的,删除文件等等
如何在存储之前检查上传文件是否有病毒?
我以前读过这个主题,但我怎样才能以编程方式进行并为用户返回结果?
避免用户上传的任何类型文件出现问题的最佳方法是在服务器上安装命令行病毒扫描程序,用于在上传后扫描文件。如果扫描仪结果是肯定的,删除文件等等
看看 Sophos API https://secure.sophos.com/partners/oem/integration/savdi.html
“SAV 动态接口 (SAVDI) 为 Sophos 检测引擎提供了一个易于集成的通用接口。它使以任何语言编写的程序能够扫描文件和数据中的恶意软件,并且特别受运行在.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**
为了让您的生活更轻松...只需查看 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 多个引擎来扫描文件。
尝试在线资源进行扫描,例如 virusTotal 或类似的。另外据我所知,卡巴斯基有一个在线扫描仪,但暂时不可用。
从应用程序的角度来看,您可以创建一个代理服务器,您可以在其中安装防病毒软件,将文件上传到此服务器,扫描并传输到您的目标服务器
我正在寻找解决一个非常相似的问题,但在内存扫描方面没有找到太多。我发现的大多数示例都涉及将文件写入磁盘,然后通过将一些变量传递给另一个进程来扫描磁盘上的文件。
因此,在我使用的解决方案中,我只使用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 实现可以在 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;
}
}
我创建了一篇博文,详细介绍了如何使用 ClamAv 执行此操作。
对这个话题做了一些研究,这里是总结。(主要针对Windows和C#,因为我使用的是Windows,我们使用的是赛门铁克杀毒软件)
赛门铁克产品:
一个。Systemtec 扫描引擎。:它就像一个私人的防病毒服务,它提供SDK集成到您的系统中。
湾。Doscan.exe :这是我在我们公司系统中可以找到的命令行工具。我们可以通过创建一个新进程来扫描文件的方式在我们的代码中使用。它使用与赛门铁克扫描仪相同的扫描过程。所以软件在长时间扫描时会被屏蔽。
防病毒扫描仪
该库是您在 Windows 操作系统上安装的防病毒软件产品(例如“Microsoft Security Essentials (Windows Defender)”)的包装。由于我无法在我的机器上停止对赛门铁克的实时扫描,所以不知道它是否有效。我发现一个用户说它不起作用但我没有检查。
Windows 后卫:
它是一款内置于Windows系统的杀毒软件。据说有一个命令行工具(mpcmdrun.exe),但我在我的机器上找不到它。当我们使用赛门铁克时,它被禁用了。如果你有它,你可以试一试。
开源反病毒产品
ClamAV 是一种流行的。一些产品将其集成到他们的系统中。而且它有C# API,所以它也可以用来做一个私有云扫描引擎。
商业扫描引擎开放 API,例如:Virustotal 和 Sophos。