Django запретить загрузку изображений, содержащих возможный код XSS - PullRequest
7 голосов
/ 07 августа 2020

Я создаю сайт, на который пользователи могут загружать изображения. Я использую django-storages для пересылки этих изображений в корзину S3, но недавно я прочитал документы по безопасности на сайте Django: https://docs.djangoproject.com/en/3.0/topics/security/#user -uploaded-content

Обработка загрузки мультимедиа в Django создает некоторые уязвимости, когда этот носитель обслуживается способами, не соответствующими рекомендациям по безопасности. В частности, файл HTML может быть загружен как изображение, если этот файл содержит допустимый заголовок PNG, за которым следует вредоносный HTML. Этот файл пройдет проверку библиотеки, которую Django использует для обработки изображений ImageField (Pillow). Когда этот файл впоследствии отображается пользователю, он может отображаться как HTML в зависимости от типа и конфигурации вашего веб-сервера.

Он сообщает мне об этой уязвимости, но не предоставляет мне эффективный способ защиты от этих уязвимостей. Какая из наиболее уязвимых атак на веб-сайтах занимает третье место.

Рассмотрите возможность обслуживания файлов stati c из облачной службы или CDN, чтобы избежать некоторых из этих проблем.

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

Мой вопрос: Является ли загрузка и передача изображений в AWS S3 и из *1038* S3 уязвима для этих атак, и если не , каков эффективный способ очистки содержимого изображения?

Редактировать за вознаграждение: Я размещаю изображения на S3, какие типы атак или уязвимости могут произойти? А как предотвратить такие атаки?

Ответы [ 2 ]

2 голосов
/ 17 августа 2020

Почему бы просто не проверить, что файл является действительным изображением?:

from PIL import Image
image = Image.open(file)
image.verify()

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

Или, может быть, вы можете попробовать определить тип?:

import imghdr
path = 'Image.jpg'
imghdr.what(path)

Или

from PIL import Image
image = Image.open('myimage.png')
image.format

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

1 голос
/ 15 августа 2020

Лучшее возможное решение исходит из самой библиотеки Pillow .

Даже если кто-то может манипулировать заголовками файла HTML, чтобы они выглядели как файлы PNG, при попытке выполняя с ними какую-либо операцию (скажем, изменение размера ), он просто не будет работать и выдаст ошибку, поэтому вы можете зафиксировать его внутри блока try except и предупредить / пометить пользователя о злонамеренных намерениях.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...