Проверка на вирусы файлов с японскими символами в C# с использованием nClam и ClamAV
Мы работали над реализацией процедуры проверки на вирусы для файлов, загружаемых в нашу систему - это веб-приложение на C#, где мы использовали плагин nClam для общения с сервером ClamAV. В очень простой настройке ( скопированной из справки nClam) это выглядит так
string filePath = "C:\\test\\jp TEST 昨夜のコンサート.txt";
var clam = new ClamClient("localhost", 3310);
var scanResult = clam.ScanFileOnServer(filePath); //any file you would like!
Console.WriteLine("Japan test");
switch (scanResult.Result)
{
case ClamScanResults.Clean:
Console.WriteLine("The file is clean!");
break;
case ClamScanResults.VirusDetected:
Console.WriteLine("Virus Found!");
Console.WriteLine("Virus name: {0}", scanResult.InfectedFiles.First().VirusName);
break;
case ClamScanResults.Error:
Console.WriteLine("Woah an error occured! Error: {0}", scanResult.RawResult);
break;
}
Теперь, когда я пытаюсь выполнить это, я всегда получаю сообщение об ошибке после сканирования - сам файл является просто текстовым файлом с некоторыми случайными символами. Я получаю сообщение об ошибке "Нет такого файла или каталога. ОШИБКА"
Если я запускаю консольную команду ClamAV для сканирования файлов в папке, похоже, она работает нормально. Я думаю, что это проблема декодирования пути, но я пробовал различные схемы кодирования, и это, похоже, не работает.
В методе nClam есть некоторый код, который анализирует путь к файлу в команду для сервера ClamAV
var commandText = String.Format("z{0}\0", command);
var commandBytes = Encoding.UTF8.GetBytes(commandText);
Может ли это повлиять на японские символы?
1 ответ
Решение, которое я получил, состоит в том, чтобы просто заменить все японские (и другие не поддерживаемые) символы в имени файла и использовать настоящее имя файла после проверки на вирусы, т.е.
private string ReplaceUnsupportedCharacters(string fileName)
{
const int MaxAnsiCode = 255;
foreach (var illegalChar in fileName.Where(c => c > MaxAnsiCode))
{
fileName = fileName.Replace(illegalChar, '-');
}
return fileName;
}
Я бы предпочел не делать этого, но сейчас я не вижу лучшего способа!