Безопасность загрузки файлов

У меня есть общедоступная веб-форма, которая имеет возможность загрузки файлов. Теперь файлы либо сохраняются на веб-сервере, либо отправляются в виде вложения в электронном письме. У нас есть ограничение на размер i.e 15 МБ и расширения загружаемого файла. Наш SMTP-сервер находится на одном веб-сервере. Я беспокоюсь о безопасности, так как любой может загружать вредоносные файлы и может влиять на наш веб-сервер.

Каковы риски, которыми я буду обладать таким контролем загрузки файлов, доступным для общественности? В любом случае, кто-то может запустить вредоносный script на веб-сервере, загрузив вредоносный файл.

Я провел некоторое исследование и выяснил следующие моменты

  • Если я отправил файл в виде вложения в электронном письме, этот файл будет храниться в течение временного периода в временных папках ASP.Net, и после отправки электронной почты это будет удалено.
  • Вы можете переименовать файл перед сохранением в файловой системе.
  • Вы можете сохранить файл в другом месте в качестве своего веб-сайта.
  • У вас может быть какая-то проверка вирусов в реальном времени. Я не уверен, как вы можете это сделать. Я читал о некоторых проверках вирусов командной строки. Но не уверен, действительно ли мне это нужно.

Это всего лишь несколько баллов, но я хотел бы узнать о любых слепых пятнах при загрузке файлов.

Ответ 1

Чтобы ответить на вопрос о возможных уязвимостях безопасности, да, вы можете определенно создавать уязвимости в своем приложении и для своих пользователей, даже если вы не сохраняете файл на диске. Но есть несколько линий защиты, которые вы можете предпринять для проверки.

Во-первых, чтобы явно ограничить типы файлов, которые можно загрузить, вы можете сделать это с помощью белого списка и проверить расширение , но не останавливайтесь на нем. Вы также должны проверить, просмотрев содержимое файла, чтобы убедиться, что он соответствует ожидаемому формату. Это может иметь решающее значение, так как плохой парень может вставлять заголовки файлов в загруженный файл и использовать вашу систему в качестве зомби для передачи своих вредоносных программ.

Во-вторых, вы должны запустить проверку вирусов с загруженным файлом, вы можете сделать это, используя командную строку для запуска локального антивируса. Это легко сделать со многими проверками вирусов, включая Trend Micro, и если вы не смотрите на огромное количество загрузок файлов, это не должно быть огромным налогом на вашем сервере.

Убедитесь, что вы никогда не передаете пути как пользовательские данные (через GET или POST для загрузки), поскольку это может привести вас к атаке обхода пути. Если вашему пользователю необходимо загрузить файл из браузера, вы можете создать базу данных, в которой хранятся записи, а затем создать контроллер или страницу, которые будут извлекать их на основе записи базы данных и доступа пользователей к этой записи, а не предоставлять путь, который пользователь может контролировать и использовать для получения файлов с вашего сервера.

Убедитесь, что каталог, который вы сохраните, не читается веб-сервером, таким образом они не загружают вредоносную программу script, а затем выполняют ее из своего браузера через HTTP p >

Убедитесь, что вы проверяете все пользовательские вводные данные против некоторой библиотеки анти-XSS (Microsoft предоставляет один http://www.microsoft.com/en-us/download/details.aspx?id=28589)

Надеюсь, что это поможет!

Ответ 2

Лучший способ - загрузить их в папку /App _Data или сохранить их в базе данных в виде двоичных объектов. App_Data не читается через веб-сервер, поэтому это защитит вас от выполнения и доступа script. Альтернативой их хранению в двоичном формате является то, что Base 64 кодирует их и сохраняет их в тексте (снова либо в файловой системе App_Data, либо в базе данных).

Создайте страницу прокси, чтобы проверить, что у пользователя есть разрешения на просмотр/загрузку файла, и если это так, отправьте поток файла в ответ HTTP. Таким образом, пользователи не имеют прямого доступа и не могут выполнять все, что им не нужно. Вы также можете прикреплять файлы, используя классы SMTP, из ссылки на поток.

Если вы храните в файловой системе, вы можете реализовать свое собственное соглашение об именах, чтобы запрос на фактический файл сопоставлялся с сохраненной версией.

Вирусное сканирование может быть полезным, но подумайте об этом как о защите других пользователей, у которых может быть доступ к загрузке файла, а не к защите вашего сервера.