Загрузка изображений - проблемы с безопасностью

Я разрабатываю веб-приложение ASP.NET и хочу, чтобы пользователь мог либо загружать изображение из своей локальной системы, либо передавать URL-адрес изображения. Изображение может быть JPG или PNG. Какие проблемы безопасности я должен беспокоиться об этом? Я видел различные способы встраивания кода в файлы JPG. Существуют ли какие-либо методы в С# (или внешние библиотеки), которые могут подтвердить, что файл является JPG/PNG, иначе выведите ошибку? По крайней мере, я создаю каталог, в котором хранятся загруженные изображения, не просматриваемые и устанавливающие максимальный размер 1 Мб, но я бы хотел выполнить дополнительные проверки.

Спасибо за любой совет.

Ответ 1

Существуют ли какие-либо методы в С# (или внешние библиотеки), которые могут подтвердить, что файл является JPG/PNG, иначе выведите ошибку?

Может быть, но это само по себе не помогает. Вы можете легко сделать файл, который является как действительным форматом изображения, так и содержит активный контент HTML/ script для обтекания содержимого IE, чтобы наткнуться. Или тогда возникают проблемы с разбитыми политиками происхождения Java и Flash, которые могут иметь такой же эффект от сценариев в контексте безопасности сервера.

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

  • Если вы не можете этого сделать, наилучшим выбором для смягчения всех проблем, связанных с содержанием, является обслуживание ваших изображений из другого [дополнительного] домена, который не имеет доступа к каким-либо чувствительным учетным данным (файлы cookie, основные auth) основного сайта.

  • Если для этой цели используется субдомен, например images.example.com, ваш основной сайт должен быть доступен только через www.example.com, а не example.com. В противном случае содержимое, введенное в images.example.com, может получить доступ к файлам cookie для example.com в IE. example.com должен 301 перенаправить на www.example.com, чтобы предотвратить нежелательную утечку cookie в целом.

  • Добавьте заголовок X-Content-Type-Options: nosniff к ответу на блокирование контрафактных атак из IE8. (Не помогает с более ранними версиями, увы.)

также:

  • Санизировать указанные имена файлов сложно, особенно если ваше приложение, скорее всего, работает на сервере Windows, где правила об используемых именах файлов действительно сложны. Хорошее место для запуска позволяет использовать только буквенно-цифровые символы и добавлять собственные расширения и префикс файла. (Префикс необходим, чтобы избежать зарезервированных имен файлов Windows и пустого имени файла.)

  • Лучше: сохранить предоставленное пользователем имя файла в базе данных вместо того, чтобы использовать его как настоящее имя файла.

См. этот вопрос для более подробного обсуждения проблем безопасности загрузки файлов.

Ответ 2

Это абсолютное минное поле. Что-то принять во внимание (не обязательно исчерпывающий список, никаких гарантий и т.д.).

  • Некоторые люди используют регулярные выражения для синтаксического анализа, поэтому нет способа узнать, содержит ли файл код. Файлы ZIP имеют свою директорию в конце. Sun/Oracle Java PlugIn/WebStart теперь проверяет, что файл начинается с макового номера локального заголовка/записи ZIP, чтобы избежать атак типа "GIFAR".
  • Служить из другого домена, чтобы избежать проблем с тем же происхождением.
  • Служите с другого IP-адреса, чтобы избежать проблем с тем же происхождением.
  • Немного сложно проверить, использует ли файл, скажем, переполнение буфера на 0 дней. Он может даже использовать бесконечный цикл для создания DoS.
  • Лучше всего перекодировать изображение.
  • Осторожно с указанием имени URL/файла. Если вы дадите опцию, используйте проверку белого списка. В частности, символы NUL являются "забавными". См. Также атаки обхода каталога. В общем, имея возможность разместить файл с заданным содержимым, известное местоположение, по крайней мере, является большим хитроумным.
  • Или изображения, которые вы можете проверить, чтобы размер был нормальным. Декомпрессия огромного изображения вполне может привести к DoS. Также обратите внимание, что алгоритмы сжатия часто позволяют сжимать тривиальные данные с помощью огромных факторов.

Ответ 3

Не позволяйте пользователю определять имя файла, которое будет использоваться на вашем сервере. Вместо этого используйте [сгенерированный guid].jpg и поместите имя файла, которое они использовали в таблице базы данных, если вам это нужно.

См. № 12 здесь: http://www.codinghorror.com/blog/2009/01/top-25-most-dangerous-programming-mistakes.html

Внешний контроль имени файла или пути. Когда вы используете внешний ввод при построении имени файла, результирующий путь может указывать на внешний от предполагаемого каталога. Нападавший может сочетать несколько ".." или аналогичных последовательности, вызывающие системы для перехода из ограниченный каталог. Другие атаки, связанные с файлами, упрощаются внешний контроль имени файла, такой как символическая ссылка, которая заставляет ваше приложение читать или изменять файлы, которые злоумышленник не может доступ напрямую. То же самое относится, если ваша программа работает с повышенной привилегий, и он принимает имена файлов как вход. Аналогичные правила применяются к URL-адресам и позволяя постороннему указывать произвольные URL-адреса.

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

Ответ 4

Вы можете использовать Инфраструктура как услуга для обработки изображений, например, наше решение - Uploadcare:

https://uploadcare.com

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