Как организовать хранение файлов в PHP проекте?

Пишется HelpDesk внутри CRM специально под клиента.
Интересует как организовать хранение файлов, не структура папок и связи с базой, а сам процесс сохранения и отдачи файла.

Интересует ситуация именно защиты проекта от взлома через заливку файлов.
К примеру как защититься от заливки php скриптов.
Есть идея что бинарные отдавать нужно через первый вариант отсюда habrahabr.ru/post/151795
Но если такой вариант для бинарника норм, то как быть с картинками которые было бы не плохо отрисовывать на некоторых страницах, но при этом не попасть на исполнение подсунутых вместо картинок скриптов.

UPD1: пока читал все предложения, в голову пришла мысль - на сколько безопаснее/удобнее будет организовать виртуалку с файловым хостингом под это дело, на чем ее лучше организовывать и как пользоваться им из под PHP.

если к примеру CMS на corp.company.ru то в соседней виртуалке держать files.company.ru
вопрос лишь как это удобнее использовать с минимальными потерями ресурсов системы.
  • Вопрос задан
  • 2305 просмотров
Пригласить эксперта
Ответы на вопрос 4
abler98
@abler98
Software Engineer
Хранить файлы в папке, недоступной пользователям, а изображения выводить средствами PHP, например, Imagick:

/image.php
$path = 'uploads/image.png';
$image = new Imagick($path);
$image->setImageFormat('png');
header('Content-type: image/png');
echo $image->getImageBlob();
$image->close();

/index.php
<img src="image.php">
Ответ написан
@1Rockman
Храните файлы в недоступном для паблика месте, запретите скачивать файлы напрямую и уж тем более выполнять php. Отдавайте файлы как в примере на хабре, примерно таким же способом отдавайте и картинки. Храните имена файлов в базе, а сами файлы на диске храните без расширения и вместо имени можно использовать например md5 хэш.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Файлы должны хранится в не публичном каталоге.
2. Проверка доступа - php часть с отдачей на базе заголовков X-Sendfile, или X-Accel-Redirect. Читать и отдавать с помощью php - очень дорого.
3. Ну и конечно права на запуск должны отсутствовать.
Ответ написан
Комментировать
mramor
@mramor
нечего о себе рассказывать.
Всё сказали верно, но забыли еще одно - нужно фильтровать прилетающие на сервер переменные , ибо в имя файла можно запихать путь, в итоге как каталог не защищай, а сохранить файл можно в инном месте, например в корне. Именно так зачастую и заливаются на сайт через всякие fileuploader'ы, которые держат настройки на стороне клиента, например в js и конечно в таком случае никаких настроек не держать в фронтед скриптах.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы