Intereting Posts
Возврат JSON не работает должным образом Использование mod_rewrite для преобразования путей с хэш-символами в строки запроса FTP Uploader с использованием php Отобразить результаты проверки формы PHP на той же странице php сортировка массива по предопределенному порядку В чем разница между inversedBy и mappedBy? Как мы можем получить конкретные ссылки, используя простой html dom Использование php для интерпретации сообщения из параллельного порта Высокие значения круговых диаграмм HighCharts X-axies не отображаются при попытке получить данные из базы данных MySQL с помощью PHP вернуть массив объектов Как создать или определить класс в PHP во время выполнения? Как отправить пустой массив из формы HTML Form на PHP Weird PHP error: «Невозможно использовать возвращаемое значение функции в контексте записи» Как получить все заявления использования, объявленные в файле класса PHP Перевод Yii2 не работает

Получение файла на сервере, изменение размера с помощью PHP GD2, соображения безопасности

Каковы соображения безопасности, когда сервер извлекает файл из ненадежного домена?

Каковы соображения безопасности при изменении размера изображения, которому не доверяют библиотеки PHP GD2?

Файл будет сохранен на серверной машине и будет предлагаться для загрузки. Я знаю, что не могу доверять заголовку MIME-Type. Есть ли что-нибудь еще, о чем я должен знать?


У меня есть веб-сервис, который выглядит так:

вход

URL-адрес http (или строка, которая, как ожидается, будет URL-адресом)

вывод

Мета-описание файла или ошибка, если он есть.

Мета-описание имеет одну из двух форм:

  1. Это изображение + URL-адрес изображения в моем домене + эскиз изображения (сгенерированный и размещенный на моем сервере)
  2. Это не изображение + URL-адрес файла в моем домене

Обновить

Проблемы, которые я могу придумать:

  1. Удаленный сервер – это вредоносный сервер, который отправит крошечные биты информации, достаточно, чтобы открыть сокет, но не делает ничего полезного – например, slowloris. Я не знаю, насколько реальна эта угроза. Полагаю, это можно было бы легко избежать с помощью тайм-аута + проверки прогресса.

  2. Удаленный сервер обслуживает то, что выглядит как изображение (заголовки, mime-type), но вызывает сбой PHP, когда я загружаю его с помощью GD2.

  3. Сервер отправляет бесполезный или плохой заголовок MIME-типа. Как text-plain для двоичных файлов.

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

  5. Удаленный сервер обслуживает файл с вирусом. Файл не будет рассматриваться как изображение, поэтому мой сервер ничего не сделает с ним. Ничего не произойдет до тех пор, пока пользователь не загрузит и не запустит его.

Кроме того, я полагаю, я могу доверять пользователям моего сервиса. Это частное приложение в ситуации, когда пользователи могут нести ответственность за плохое поведение. Я предполагаю, что они не намеренно пытаются его сломать.

Related of "Получение файла на сервере, изменение размера с помощью PHP GD2, соображения безопасности"

Каковы соображения безопасности, когда сервер извлекает файл из ненадежного домена?

Домену (хосту) и файлу не нужно доверять. Это распространяется на два пункта:

  1. Транспорт
  2. Данные

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

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

Каковы соображения безопасности при изменении размера изображения, которому не доверяют библиотеки PHP GD2?

Затем не передавайте ненадежные данные в библиотеку изображений. См. Вышеприведенный шаг, сначала принесите его в безопасное состояние.

Файл будет сохранен на серверной машине и будет предлагаться для загрузки. Я знаю, что не могу доверять заголовку MIME-Type. Есть ли что-нибудь еще, о чем я должен знать?

Я думаю, что вы все еще в точке выше. Как прийти в безопасное от ненадежного . Конечно, вы не можете доверять заголовку Content-Type, однако хорошо понимать и его.

Вы хотите защитить от уязвимости OWASP, связанной с неограниченной загрузкой файлов .

  1. Проверьте имя файла. Если вы храните данные на своем сервере, дайте ему безопасное временное имя, которое невозможно угадать заранее и недоступное через Интернет.
  2. Проверьте данные, связанные с именем файла, например URL-адрес источника этого файла. Правильно обрабатывайте кодировку.
  3. Бросьте что-нибудь, что не соответствует вашим ожиданиям, поэтому проверьте предварительные условия, которые вы формулируете строго.
  4. Проверяйте данные файла перед продолжением, например, с помощью проверки вирусов.
  5. Подтвердите данные изображения перед продолжением. Это включает в себя файловые заголовки (магические числа), а также то, что размер файла и содержимое файла действительны. Вы должны использовать библиотеку, которая специализировалась на задании, например, файл-файл-формат-исправление ошибок. Это специализированное программное обеспечение, поэтому, если эта часть вашего бизнеса попадает в бизнес. Существует много файлов с кодом свободного программного обеспечения, я оставляю это только для информации, вы ни в коем случае не можете доверять какой-либо рекомендации и должны войти в эту тему.
  6. Если вы планируете самостоятельно изменить размер изображения, вам нужно сделать все в два раза безопаснее, потому что рядом с хостингом вы планируете обрабатывать данные. Поэтому сначала знайте, что вы делаете с данными, чтобы найти потенциальные области проблем.
  7. Ведение журнала и мониторинг.
  8. У вас есть план на случай, что все ошибается.
  9. Подумайте о том, чтобы повторить процесс для уже существующих файлов, поэтому, если вы измените свою процедуру, вы сможете автоматически применять принципы к загрузкам, которые были сделаны и в прошлом.
  10. Создайте систему для каждого типа работы, которая может быть очищена после выполнения работы. Одна система для загрузки, одна система для получения метаданных и т. Д. После каждого действия восстановите систему с изображения. Если отдельные компоненты не работают, они не будут оставлены в эксплуатируемом состоянии. Кроме того, если вы обнаружите ошибку, вы можете отключить всю свою систему, пока не найдете недостаток.

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

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

Если хостинг не является частью вашего бизнеса, почему бы не передать его амазонке s3 или подобным магазинам? Ваш домен может быть сохранен через настройки DNS.

Храните библиотеки, которые вы используете для проверки изображений с обновлением (подразумевая, что вы знаете, какие библиотеки используются и их versio, например, расширение PHP exif использует mbstring и т. Д. – отслеживает все дерево вниз). Позаботьтесь о том, чтобы вы могли сообщать об ошибках администраторам библиотек полезным способом, например, с протоколированием, хранением данных для воспроизведения и т. Д.

Получите знания о том, какие эксплоиты для изображений существовали в прошлом и какие системы / компоненты / библиотеки ( например, см. Отказ от ответственности ) были затронуты.

Также зайдите в тему, которая является распространенным способом использования чего-то, чтобы собрать основы (я уверен, что вы знаете, однако всегда полезно перечитать некоторые вещи):

  • Безопасная загрузка файлов в веб-приложениях PHP (Alla Bezroutchko, 13 июня 2007 г., PDF)

Некоторые связанные вопросы, в ассортименте:

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

То, что вы описываете, в основном сводится к проблеме проверки ввода; вы не доверяете чтению своего приложения в качестве ввода и обработки.

Чтобы решить эту проблему, вам нужно загрузить этот ресурс, а затем попытаться определить истинный тип файла. Существует несколько способов сделать это, но в основном вы захотите использовать какой-либо пользовательский код или библиотеку для анализа через файл и поискать признаки подсказки определенного типа. Существует хорошая дискуссия SO о том, как это сделать в PHP здесь. Как я могу определить истинное расширение / тип файла программно? – Я бы проверил второй ответ, в котором перечислены некоторые функции, специфичные для PHP, для этого. Когда ваше приложение получает файл, оно должно выполнить некорректное типирование файлов, подобное этому, а затем сравнить результат с тем, какой тип MIME указан на удаленном сервере; если они соответствуют принятому файлу, а если нет, отбросьте его.

Я также предложил бы использовать белый список допустимых типов файлов (список всего, что будет поддерживать ваш сервис, а затем ТОЛЬКО принимать файлы этих типов). Если у вас есть служба общего назначения, вы должны, по крайней мере, сделать черный список запрещенных типов файлов (список всего, что ваш сервис абсолютно не поддерживает, и сразу же отбросить их по результатам вашего типа MIME). Опять-таки, использование их полностью зависит от ваших прецедентов.

После того, как у вас есть тип, проблема будет связана с тем, что удаленный сервер отправил вам, – это плохой файл, который нацелен на ваш сервер (содержит вредоносный код, переполнение буфера, предназначенное для взлома библиотеки GD2 и запуска произвольного кода и т. Д.). В принципе, вы полагаетесь на библиотеку GD2, чтобы не содержать ошибок, которые могли бы привести к такому успешному использованию. Здесь мало что можно сделать, если не выполнить аудит безопасности в библиотеке самостоятельно, и я собираюсь предположить, что это вне сферы действия. В принципе, следите за сообщениями об ошибках в системе с библиотекой и патчем, как только сможете; как потребитель библиотеки, вы действительно полагаетесь на сопровождающих, чтобы находить и устранять уязвимости безопасности, подобные этому.

Далее, проблема заключается в том, что удаленный сервер отправил вам плохие файлы, предназначенные для ваших пользователей / клиентов (содержит вредоносный код, переполнение буфера, вирусы и т. Д.). Здесь, если есть поврежденные данные, которые действительно вредоносные программы на изображении, скорее всего, либо (1) сломают или используют GD2 при его чтении (см. Выше для этого сценария), либо (2) будут устранены при выполнении операции изменения размера библиотекой, если GD2 может успешно обработать ее. По-прежнему есть шанс, что он останется, несмотря на обработку, но вы тоже ничего не можете сделать. Если вы действительно обеспокоены этим, вы можете применить virusscan, используя для этого внешний продукт; Я бы предположил, что если вы сделаете это, сделайте это как (1) после загрузки, так и перед обработкой GD2, а затем (2) на управляемом файле, прежде чем вы его подадите. Лично я не думаю, что вы многого добиваетесь, но если вы хотите предоставить своим пользователям дополнительные проверки / теплые пушистики, это не повредит.

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

1) Моя основная забота о слепое извлечение файла из ненадежного домена будет заключаться в том, как убедиться, что файл фактически является тем, что вы ожидали получить; может ли ненадежный сервер обмануть ваш скрипт в загрузке вредоносного файла (например, вируса) или, возможно, сценария, который позволит сделать бэкдор в вашей системе?

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

3) Я (лично) никогда не делал этого, не просматривая каждый файл, который первый скрипт загружал первым. Если вы хотите частично автоматизировать это, вы можете попробовать запустить тесты магического числа во всех файлах в качестве предварительного фильтра. Но человеческий взгляд – самый безопасный способ служить случайным файлам. Когда вы закончите этот проект – прежде чем вы начнете жить – попытайтесь сломать / обмануть / взломать его так сильно, как сможете. Помогите некоторым знающим друзьям.

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