同步操作将从 八爪鱼工作室/JESAI.ClamAV.NetScanner 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
本项目是一个互联网云查杀方案,主要是利用TCP通信和ClamAV服务器交互,从而进行一些文件或者需要查杀的东西在云端杀毒,当然了,ClamAV也可以本地杀毒,使用本项目的前提,你要学会搭建ClamAV服务器。详情请看:https://www.clamav.net/。本类库目前是netcore3.1平台。
clamav是思科开源的一个杀毒引擎。ClamAV的®是一个开源(GPL)的各种情况,包括电子邮件扫描,Web扫描和终点的安全使用防病毒引擎。它提供了许多实用程序,包括灵活且可扩展的多线程守护程序,命令行扫描程序和用于自动数据库更新的高级工具。官网有完善的文档和工具,具体请自行研究。
services.AddClamAVNetScanner();
如果需要自定义配置信息,则增加如下代码
//IClamAvScannerConfiguration不配置的话,会默认
//Host = "127.0.0.1",
//Port = 3310,
//MaxChunkSize = 2014,
//MaxStreamSize = 26214400
IClamAvScannerConfiguration configuration = new ClamAvScannerConfiguration()
{
Host="127.0.0.1",
Port=3310,
MaxChunkSize=2014,
MaxStreamSize= 26214400
};
services.AddClamAVNetScanner(configuration);
//也可以这样用
//services.AddClamAVNetScanner((s) => { s.AddSingleton<IClamAvScannerConfiguration>(configuration); });
然后在services.AddControllersWithViews();后面加上services.AddClamAVNetScannerDynamicWebApi();可以不加,不加的话WebApi不会生效。
services.AddControllersWithViews();
services.AddClamAVNetScannerDynamicWebApi();
app.UseClamAVNetScanner();
private readonly IClamAVScannerClient ClamAVScannerClient;
public HomeController(ILogger<HomeController> logger, IClamAVScannerClient clamAVScannerClient)
{
_logger = logger;
ClamAVScannerClient = clamAVScannerClient;
}
3.1 获取ClamAV服务器版本 GetVersionAsync;
3.2 在ClamAV服务器上执行PING命令。 PingAsync;
3.3 扫描ClamAV服务器上的文件/目录。 ScanFileOnServerAsync;
3.4 使用服务器上的多个线程扫描ClamAV服务器上的文件/目录。 ScanFileOnServerMultithreadedAsync;
3.5 将数据作为流发送到ClamAV服务器(Byte)。 SendAndScanFileAsync;
3.6 将数据作为流发送到ClamAV服务器(Byte)。 SendAndScanBytesAsync;
3.6 将数据作为流发送到ClamAV服务器(Stream)。 SendAndScanFileAsync;
3.7 从路径读取文件,然后将其作为流发送到ClamAV服务器。 SendAndScanFileAsync;
using JESAI.ClamAV.NetScannerCore.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace JESAI.ClamAV.NetScannerCore
{
public interface IClamAVScannerClient
{
/// <summary>
/// 获取ClamAV服务器版本
/// </summary>
Task<string> GetVersionAsync();
/// <summary>
/// 获取ClamAV服务器版本
/// </summary>
/// <param name="cancellationToken">用于请求的取消令牌</param>
Task<string> GetVersionAsync(CancellationToken cancellationToken);
/// <summary>
/// 在ClamAV服务器上执行PING命令。
/// </summary>
/// <returns>如果服务器以PONG响应,则返回true。否则返回false。</returns>
Task<bool> PingAsync();
/// <summary>
/// 在ClamAV服务器上执行PING命令。
/// </summary>
/// <param name="cancellationToken">用于请求的取消令牌</param>
/// <returns>如果服务器以PONG响应,则返回true。否则返回false。</returns>
Task<bool> PingAsync(CancellationToken cancellationToken);
/// <summary>
/// 扫描ClamAV服务器上的文件/目录。
/// </summary>
/// <param name="filePath">ClamAV服务器上文件/目录的路径。</param>
Task<ScannerResult> ScanFileOnServerAsync(string filePath);
/// <summary>
/// 扫描ClamAV服务器上的文件/目录。
/// </summary>
/// <param name="filePath">ClamAV服务器上文件/目录的路径。</param>
/// <param name="cancellationToken">用于请求的取消令牌</param>
Task<ScannerResult> ScanFileOnServerAsync(string filePath, CancellationToken cancellationToken);
/// <summary>
/// 使用服务器上的多个线程扫描ClamAV服务器上的文件/目录。
/// </summary>
/// <param name="filePath">ClamAV服务器上文件/目录的路径。</param>
Task<ScannerResult> ScanFileOnServerMultithreadedAsync(string filePath);
/// <summary>
/// 使用服务器上的多个线程扫描ClamAV服务器上的文件/目录。
/// </summary>
/// <param name="filePath">ClamAV服务器上文件/目录的路径。</param>
/// <param name="cancellationToken">用于请求的取消令牌</param>
Task<ScannerResult> ScanFileOnServerMultithreadedAsync(string filePath, CancellationToken cancellationToken);
/// <summary>
/// 将数据作为流发送到ClamAV服务器。
/// </summary>
/// <param name="fileData">包含文件数据的字节数组。</param>
/// <returns></returns>
Task<ScannerResult> SendAndScanFileAsync(byte[] fileData);
/// <summary>
/// 将数据作为流发送到ClamAV服务器。
/// </summary>
/// <param name="fileData">包含文件数据的字节数组。</param>
/// <returns></returns>
Task<ScannerResult> SendAndScanBytesAsync(byte[] bytes);
/// <summary>
/// 将数据作为流发送到ClamAV服务器。
/// </summary>
/// <param name="fileData">包含文件数据的字节数组。</param>
/// <param name="cancellationToken">用于请求的取消令牌</param>
/// <returns></returns>
Task<ScannerResult> SendAndScanFileAsync(byte[] fileData, CancellationToken cancellationToken);
/// <summary>
/// 将数据作为流发送到ClamAV服务器。
/// </summary>
/// <param name="sourceStream">包含要扫描的数据的流。</param>
/// <returns></returns>
Task<ScannerResult> SendAndScanFileAsync(Stream sourceStream);
/// <summary>
/// 将数据作为流发送到ClamAV服务器。
/// </summary>
/// <param name="sourceStream">包含要扫描的数据的流。</param>
/// <param name="cancellationToken">用于请求的取消令牌</param>
/// <returns></returns>
Task<ScannerResult> SendAndScanFileAsync(Stream sourceStream, CancellationToken cancellationToken);
/// <summary>
/// 从路径读取文件,然后将其作为流发送到ClamAV服务器。
/// </summary>
/// <param name="filePath">文件/目录的路径。</param>
Task<ScannerResult> SendAndScanFileAsync(string filePath);
/// <summary>
/// 从路径读取文件,然后将其作为流发送到ClamAV服务器。
/// </summary>
/// <param name="filePath">文件/目录的路径。</param>
/// <param name="cancellationToken">用于请求的取消令牌</param>
Task<ScannerResult> SendAndScanFileAsync(string filePath, CancellationToken cancellationToken);
}
}
[Fact]
public async Task ScanBytes_InfectedData_ReturnsExpectedResult()
{
var ctx = IntegrationTestContext.CreateDefaultUnitTestContext();
const string sampleVirusSignature = @"1111111111111";
IClamAVScannerClient ClamAVScannerClient=ctx.Resolve<IClamAVScannerClient>();
var bytes = Encoding.UTF8.GetBytes(sampleVirusSignature);
var result=await ClamAVScannerClient.SendAndScanFileAsync(bytes);
Assert.Equal(ScanResponseStatus.VirusDetected, result.Status);
Assert.NotEmpty(result.InfectedFiles);
}
[Fact]
public async Task ScanFileStream_InfectedData_ReturnsVirusDetectedResult()
{
var ctx = IntegrationTestContext.CreateDefaultUnitTestContext();
string filePath = @"C:\Users\deng\Desktop\b.zip";
IClamAVScannerClient ClamAVScannerClient = ctx.Resolve<IClamAVScannerClient>();
var result = await ClamAVScannerClient.SendAndScanFileAsync(FileToStream(filePath));
Assert.Equal(ScanResponseStatus.VirusDetected, result.Status);
//Assert.NotEmpty(result.InfectedFiles);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。