Отправка файла в 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, без сомнения. Вы поймете это.

Другие вопросы по тегам