Загрузка изображений - проблемы безопасности - PullRequest
12 голосов
/ 08 апреля 2010

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

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

Ответы [ 4 ]

12 голосов
/ 08 апреля 2010

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

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

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

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

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

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

Также:

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

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

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

4 голосов
/ 08 апреля 2010

Это абсолютное минное поле.Что-то, что нужно принять во внимание (не обязательно исчерпывающий список, никаких гарантий и т.ZIP файлы имеют свой каталог в конце.Подключаемый модуль Sun / Oracle Java / WebStart теперь проверяет, что файл начинается с локального почтового индекса / магического номера ZIP, чтобы избежать атак «GIFAR».

Служить из другого домена, чтобы избежать проблем с тем же источником. Служите с другого IP-адреса, чтобы избежать проблем с тем же источником. Немного сложно проверить, использует ли файл, скажем, 0-дневное переполнение буфера.Для создания DoS может даже использоваться бесконечный цикл. Лучше перекодировать изображение. Осторожно с URL / именем пути к файлу.Если вы даете опцию, используйте проверку белого списка.В частности, NUL-символы "веселые".См. Также атаки через каталог.В целом, возможность разместить файл с заданным содержимым в известном месте - это, по крайней мере, большая хитрость. Или изображения, которые вы, возможно, захотите проверить, что размер нормален.Распаковка огромного изображения вполне может привести к DoS.Также обратите внимание, что алгоритмы сжатия часто позволяют сжимать тривиальные данные с помощью огромных факторов.
3 голосов
/ 08 апреля 2010

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

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

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

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

0 голосов
/ 05 декабря 2014

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

https://uploadcare.com

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

...