Intereting Posts
Сохранять и загружать входные значения с помощью локального хранилища? Самый эффективный способ отправки информационных бюллетеней Использование PHP для генерации таблицы HTML со статическим подсчетом количества данных MySQL Сортировка массива по дате в порядке убывания по дате в php Вычтите одну секунду из заданного времени Эффективность и масштабируемость массива PHP Как проверить PNG для оттенков серого / альфа-типа? Являются ли PHP DateInterval сопоставимыми с DateTime? Каков наилучший способ реализации двухстороннего шифрования с помощью PHP? Значения по умолчанию для типов данных varchar и int mysql Не использовать функцию php fopen () в wordpress functions.php Нет почты, полученной во входящих почтовых ящиках с XAMPP 1.8.0, MercuryMail и mail () конвертирование ВО ВРЕМЯ загрузки перед сохранением на сервере png / gif в jpg PHP / MySQL Pagination Получить версию сервера MySQL с PDO

Подход к безопасности загрузки изображений PHP

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

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

  1. Фотография загружается в приватную папку 777 за пределами веб-корня.
  2. Выполняется проверка для белых перечисленных расширений (разрешается только jpgs, gifs, png) все остальное удаляется.
  3. Использование getimagesize для проверки размеров min-max и достоверности фотографий.
  4. Проверка соответствия mimetype и расширения файла.
  5. Изменение размера загруженной фотографии в размеры std (с использованием imagecopyresampled).
  6. Сохранение созданных файлов как jpg.
  7. Удаление исходного файла.
  8. Сохраните фотографии с новым (не случайным именем), то есть img51244.jpg.
  9. Переместите новые фотографии в подкаталоги переменных общей папки (777 разрешений) в соответствии с не предсказуемым алгоритмом. Т.е. img10000.jpg будет храниться на photos/a/f/0/img10000.jpg а img10001.jpg будет храниться на photos/0/9/3/img10001.jpg . Это делается по другим причинам (использование субдоменов для статического контента служит или использует CDN).

Скрипт будет запущен на выделенном сервере Linux.

Solutions Collecting From Web of "Подход к безопасности загрузки изображений PHP"

  1. Каталог с chmod 0777 является, по определению, общедоступным для других пользователей, зарегистрированных на вашем сервере, а не частных. Правильные разрешения будут 700 и будут принадлежать apache (или любому пользователю, на котором работает ваш веб-сервер). Я не уверен, почему вы не использовали бы временный каталог по умолчанию для php, поскольку он также находится за пределами корня веб-сайта.
  2. Белый список – хорошая идея. Будьте осторожны, чтобы иметь правильную реализацию. Например, regexp /.png/ самом деле соответствует apng.php .
  3. Этот шаг – отличная идея. Он в основном проверяет файловую магию.
  4. Не является строго необходимым. На двух предыдущих шагах мы определили правильность формата расширения и файла. Если вам нужен правильный MIME-тип, который будет указан клиентом, вы также должны проверить, что данный тип MIME и тот, который определен выше, эквивалентны.

Шаги с 5 по 8 не связаны с безопасностью.

Шаг 9: Я предполагаю, что ваш сайт позволяет каждому видеть каждую фотографию. Если это не так, у вас должна быть схема URL с существенно более длинными URL-адресами (например, хэш-память изображения).

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

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

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

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

Вы также можете попытаться обнаружить php-код внутри содержимого изображения (с файлом_get_contents, а затем регулярное выражение для поиска «<? Php»), но я не смог найти 100% -ный безопасный способ устранения подозрительного кода, не уничтожая некоторые (действительные) изображений.