Отправка файла в VirusTotal с помощью MVC
Я студент, пробующий другой мини-проект, где пользователь может загрузить файл CSV на веб-сервер. Но прежде чем я смогу создать другую программу для запуска файла, я хотел бы отправить файл в virustotal, чтобы он проверил его на наличие вирусов.
Я пытался, но получил ошибку: "не могу преобразовать строку" в "System.IO.FileInfo" "
Вот мои коды:
контроллер
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using VirusTotalNET;
namespace Testing_1.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
public ActionResult Upload(HttpPostedFileBase file)
{
string filename = file.FileName;
VirusTotal vtObj = new VirusTotal("%API KEY%");
string resID = vtObj.ScanFile(file.FileName);
string path = Server.MapPath("~/CSV/" + file.FileName);
file.SaveAs(path);
ViewBag.Path = path;
return View();
}
}
}
Я получил ошибку в этой строке: строка resID = vtObj.ScanFile(file.FileName);
Индекс
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="File" id="file"/>
<input type="submit" value="Upload" />
}
Загрузить
@{
ViewBag.Title = "Upload";
}
<h2>Uploaded: @ViewBag.Path</h2>
Пожалуйста, помогите мне Спасибо
3 ответа
Если я прав, вы используете эту библиотеку из своего кода VirusTotal.NET
Затем, если вы посмотрите на их документацию, вы можете заметить, что метод ScanFile требует объект типа FileInfo и возвращает объект типа ScanResults. Так что строки здесь никак не включены.
Таким образом, вам нужно сохранить файл где-нибудь в вашей файловой системе, а затем создать объект FileInfo
public ActionResult Upload(HttpPostedFileBase file)
{
string filename = Server.MapPath("~/CSV/" + file.FileName);
file.SaveAs(filename);
FileInfo fi = new FileInfo(filename);
VirusTotal vtObj = new VirusTotal("%API KEY%");
ScanResults result = vtObj.ScanFile(fi);
.. ??? what to do if this is a virus ????
ViewBag.Path = filename;
return View();
}
Теперь это может вызвать проблемы с любой антивирусной программой, работающей на вашем сервере. Сохранение его перед запуском сканирования VirusTotal может вызвать действие установленного антивируса. Поэтому, возможно, вам следует исключить временную папку из конфигурации антивируса, сохранить файл и затем (после успешного сканирования) переместить файл в правильную папку назначения (или в случае проблем удалить файл из временной папки).
Я думаю, что вам нужно просмотреть документ и API всего вируса, чтобы реализовать функцию загрузки в вашем мини-проекте.
Ответ Стива выше не является хорошей идеей (загрузка файла для его сканирования) из соображений безопасности. Не используйте ScanResult. Это просто дает вам код ответа Queued, который бесполезен для загрузки файлов в реальном времени на ваш сервер. Версия 2.0 TotalVirus (доступна через диспетчер пакетов NuGet) позволяет передавать содержимое byte[] в метод GetFileReportAsync, который быстро сообщает, заражен ли он:
VirusTotal virusTotal = new VirusTotal("Your API Key Here");
FileReport fileReport = await virusTotal.GetFileReportAsync(file.Content);
while (fileReport.ResponseCode == FileReportResponseCode.Queued)
{
Thread.Sleep(1000);
}
if (fileReport.Positives != 0)
{
ModelState.AddModelError("File", "File contains potential viruses. Cannot continue with this file.");
return View(model);
}
Вам нужно будет получить ключ API от TotalVirus. Ключ по умолчанию бесплатный, но разрешает только 4 загрузки в минуту. На данный момент этого достаточно, но вам определенно понадобится приобрести профессиональный ключ для веб-страниц с высокой посещаемостью. ПРИМЕЧАНИЕ 1. Я не включаю никакой информации о том, КАК я загрузил содержимое байта []. Это другое дело. Я отсылаю вас сюда для обсуждения. ПРИМЕЧАНИЕ 2. Я нашел здесь приличный проект github , который помог мне написать код выше. ПРИМЕЧАНИЕ 3. Я не совсем уверен, как определить, когда вы превысили пределы бесплатного ключа API. Это ResponseCode, без сомнения. Вы поймете это.