Задать вопрос

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

Интересует вопрос как максимально безопасно загрузить изображение на сервер?
Имеется следующий код:
<div class="file-upload" id="file-upload">
    <label>
        <input type="file" id="avatarchange" name="file">
        <span>Выберите файл</span>
    </label>
</div>


Суть в том, что при выборе изображения, я с помощью jQuery обрабатываю его и сразу же вывожу превью этого изображения в background:
$('#avatarchange').change( function(event) {
var tmppath = URL.createObjectURL(event.target.files[0]);
$('.file-upload span').text('Фото загружено');
setTimeout(avatarOk, 3000);
     $(".img").attr('style','background: url('+URL.createObjectURL(event.target.files[0])+') no-repeat center center / cover;');
});


И хочу что бы в момент .change выполнялся post запрос к php скрипту, который уже загрузит изображение на сервер. Скажите пожалуйста, как лучше и безопаснее это сделать?
  • Вопрос задан
  • 215 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@alexalexes
На стороне PHP пропустить полученный файл через GD библиотеку.
При необходимости, уменьшить качество выходного файла, и попутно сгенерировать preview, отправив его обратно клиентку (+ подтвердив получение сервером).
Учтите, придется увеличить доступный объем оперативной памяти для одного процесса PHP.
На моем опыте, чтобы GD проглотила 16 Мпикс картинку, нужно 128 Мб ОЗУ.
Перед скармливаем GD взвешиваем картинку с помощью getimagesize().
Если это не сделать, и с превышением лимита отдать на обработку библиотеке, то скрипт тихо-мирно заглохнет, не сообщив клиенту ничего, а так можно сгенерировать сообщение, что файл большой.
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Конечно, нужно проверять и mime type, и проверять картинки валидность хотя бы функцией getimagesize(), и делать resize(). Всё это можно при желании загуглить.
Что обычно не пишут так это по поводу нагрузки на сервер при обработке картинки.
Я рекомендую грузить картинки как есть (ограничивая только по размеру файла), при этом если картинки грузятся не одновременно, то можно еще и лок повесить. Далее обработать их уже отдельным процессом асинхронно (по крону например или каким-то менеджером очереди).
Ответ написан
Комментировать
RomaZveR
@RomaZveR
CEO AlertMoney, PHP/Golang Developer
1) Не доверять ни чему что прилетает в $_FILES;
2) Проверять mime по белым спискам через finfo (тут же и размер файла);
3) Проверять extension из $_FILES по белым спискам, сопоставить с mime;
4) Формировать имя файла и расширение самому;
5) Запретить веб серверу исполнять php в папке где хранится upload;
5.1) В идеале заливать все на отдельный сервер (или сабдомен под другим юзером) чисто для статики, где php вообще отключен.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы