Как организовать безопасную загрузку фото на сервер

Статус
В этой теме нельзя размещать новые ответы.

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
416
Реакции
49
Знаю, что в нете есть статьи на эту тему (к сожалению большинству из них уже 4-5 лет, возможно они уже не актуальны), но все же хотелось бы обсудить этот вопрос у нас на форуме.
На сайте через форму загружаются фото. Нужно максимально, насколько это возможно обезопасить себя от попадания на сервер всякой гадости (шеллов и т.п.)
Каким образом это сделать?
Некоторые рекомендуют делать resize картинки. При resize файла изменяется содержимое файла — если скрипт, он просто не заработает, так как тоже подвергнется видоизменениям. Если функция resize выдаст ошибку — просто удаляем файл.
Насколько этот метод хорош? Какие есть методы лучше? Какие ещё дополнительные проверки и условия вводить в скрипте-обработчике фото?
На папку, в которую загружаются фото пришлось поставить 0777. Может дополнительно копировать в неё файл .htaccess, который запрещал бы выполнение любых файлов в этой папке? Как этот .htaccess в таком случае должен выглядеть?
Вообщем поделитесь кто как защищает свои проекты.
Судя по обилию рипов всевозможных сайтов эта тема очень актуальна...
 
1) Перед загрузкой проверяйте размер и расширение файла.
2) При созранении - сразу переименовывайте ее.
3) Правильно насройте веб сервер. Картинки должен отдавать nginx или подобное.
4) Права доступа на папку, куда заливать указать.
5) Создаете уменьшенную копию изоображения, которую и будете выводить на сайте, для того, чтобы человек не знал ни название новое, н и место где хранится.

Итого - ПХП даже не лезит к этим файлам, при их обращении фронтенд отдает их, а остальное - хоть и параноя, но не трудно сделать.
 
Вы также должны отключить PHP excecution в каталог images.
 
Насколько этот метод хорош? Какие есть методы лучше? Какие ещё дополнительные проверки и условия вводить в скрипте-обработчике фото?
чем больше различных манипуляций с файлом, тем лучше. Это может быть не только ресайз, но и наложение (текста, эффекта, другой полупрозрачной картинки), изменение формата (jpg2png, или jpg2png2jpg; иметь ввиду: при конверте png2jpg или png2jpg2png могут теряться полутона, прозрачность оригинального png; в случае jpg2png2jpg оригинальный jpg вряд ли по качеству сильно изменится). Если с пхп будет беда (или на чём сайт?), ImageMagick в помощь (там можно сразу и ресайз, и конверт сделать).
Вот только оправдывает ли цель средства...
 
1) Я использую функцию getimagesize() :
Для просмотра ссылки Войди или Зарегистрируйся
Она будет работать только, если это изображение.
2) получить доступ ко всем изображений через скрипт .htaccess использованием phpThumb:
Для просмотра ссылки Войди или Зарегистрируйся
Если файл загружен, и это не образ, это не будет доступна (например, PHP оболочки).
 
Использую вместе с функцией getimagesize(), изменение имени файла,
примерно так:
Код:
$ext = strrchr($_FILES['load']['name'], ".");
$photo = date("YmdHis",time())."$ext";
получается дата, но если много загружают сразу
можно ограничить по времени sleep (1); ,
что бы не пропадали файлы.
 
Оригинал закаченной картинки ложить в папку с закрытым доступом через htaccess
Resize картинки + для большей уверенности наложить watermark и если хоть в одном месте что-то не так - удалить.
А если надо отдавать оригинал, то отдавать через PHP файлик,

типа вот так:

Код:
  $id=round($_GET['id']);
  $src="upload/$id.jpg";
  if(!file_exists($src)){
      $src="upload/0.jpg";
  }
  Header("Content-type: image/jpeg");
  $imgcode = implode('',file($src));
  echo $imgcode;

в моём примере закрытая папка это upload
если нет файла, то подгружаеться подготовленная заранее картинк 0.jpg
при желании можно добавить и проверку на тип изображения и выдавать соответствующий заголовок
 
Пользуйтесь на здоровье :)
Если хостинг на линуксе:
- для хранения файлов просто вынесите этот каталог за пределы www директории (выше директории т.е. чтобы из вэб он был недоступен), а если нету возможности такой, то назовите каталог именем которое не подберут (напр: userimagejf202-vm39dZa3f) или
- при uploade проверяйте соответствие mime типа ожидаемому (php exif функциии) и если TRUE то сохраняйте в папку вне веб директории
- для защиты контента раздавайте файлы создавая временные жесткие или мягкие ссылки (php link(), symlink() ) - вида [дата_оконч_действия].crc_random_name и кроном проходите раз в сутки и удаляйте устаревшие ссылки(инф: жесткая ссылка(имя файла) указывает непосредственно на индексный дескриптор, а мягкая указывает на жесткую ссылку т.е. на имя файла Для просмотра ссылки Войди или Зарегистрируйся). Ни в коем случае на production сервере не отдавайте файлы средствами php.
- мягкие ссылки ложить всегда в специальный каталог типа "Для просмотра ссылки Войди или Зарегистрируйся" или каталоги симулирующие файловую структуру сайта "Для просмотра ссылки Войди или Зарегистрируйся"
- собственно также красиво можно отдавать и через ftp://
 
Проще всего при загрузке картинки использовать функцию Для просмотра ссылки Войди или Зарегистрируйся, если вместо массива вернет FALSE - можно гарантированно удалять файл. Этого более чем достаточно в 99.9% случаев, но если майор паранойя не дремлет по поводу уязвимости в реализации getimagesize, то до кучи можно отключить исполнение php в папке с картинками через .htaccess и при загрузке генерировать имя на основании того же md5 (ну или id пользователя, если грузится аватар, к примеру) и расширения из getimagesize. Больше ничего делать не требуется.

Вариант, предложенный ka291 хорош лишь на сайтах с мизерной посещалкой, отдавать статику через php - зло.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху