Защита папки upload

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Защита папки upload

Сообщение Balu »

Существуют ли модули или расширения для защиты всех файлов в папке upload?
Задача предоставить доступ к файлам только для залогиненых пользователей, причем пользователь с id 52 должен иметь доступ к файлам только в папке upload/user52, на остальные должен получать 403.
Аватара пользователя
Bezlepkin
Сообщения: 731
Зарегистрирован: 2012.11.10, 18:59
Контактная информация:

Re: Защита папки upload

Сообщение Bezlepkin »

Что бы зная url нельзя было другому скинуть?
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Защита папки upload

Сообщение Balu »

Bezlepkin писал(а): 2017.12.04, 16:47 Что бы зная url нельзя было другому скинуть?
да
Аватара пользователя
Bezlepkin
Сообщения: 731
Зарегистрирован: 2012.11.10, 18:59
Контактная информация:

Re: Защита папки upload

Сообщение Bezlepkin »

Так нельзя. Верней можно, но подходит под очень редкие случаи, когда например нужно видео показать для определенного пользователя.
Опиши свою задачу лучше
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Защита папки upload

Сообщение Balu »

Вы серьезно? редкие случаи? В моем случае пользователь загружает документы в виде картинок, xsl, pdf файлов и он должен быть абсолютно уверен, что никто кроме него их не увидит. Я не считаю что это редкий случай. Генерировать длинные рандомные имена не выход.
Проблем нет если просто направить с апача(нжинкса) при определенных условиях на экшен, который будет все проверять, кидать хедеры и файл через readfile, но в этом случае увеличится нагрузка на сервак. Вот я и спрашиваю может есть готовое решение с каким нибудь хитрым кэшем - поскольку файлов иногда очень много.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Защита папки upload

Сообщение Nex-Otaku »

Интересная задача. Я бы сделал так.

1. Для каждого пользователя завёл глобально уникальный ID (GUID) специально для работы с файлами.
Допустим "XYZ". Он будет секретным и пользователю нигде не "засвечивается". Хранится в БД в табличке пользователя.

2. Файлы пользователя кладём в папку "/upload/XYZ".

3. Запрещаем "прямой" доступ к любой подпапке папки "upload".

4. При регистрации нового пользователя, сразу генерируем ему GUID.

5. При логине пользователя генерируем ему строку типа "ABC", каждый раз рандомную.

6. При запросе "/my-files/user51/ABC/file1.jpg" скрыто от пользователя переписывать в "/upload/XYZ/file1.jpg" правилами Rewrite апача. То есть файл отдаём сразу, без браузерного редиректа, но средствами веб-сервера, не включая обработку PHP.

7. Файл с правилами Rewrite ABC->XYZ хранится в папке "/my-files/user51/" и "включается" апачем при обработке запроса "/my-files/user51/...".

Ну и всякие оптимизации здесь можно придумать, в зависимости от ваших условий. В целом вот так.
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Защита папки upload

Сообщение Balu »

Спасибо огромное. Два вопроса:
1. пункт 6 - как вебсервер будет сравнивать user51 и XYZ - откуда он знает об их соотвествии? мы будем дописывать htaccess каждый раз как регистрируется пользователь? что если за статику отвечает нжинкс?
2. тот же вопрос про ABC - откуда вебсервер знает текущий индификатор сессии клиента? Потому-что если он его не сравнивает, то любой может воспользоваться ссылкой
Или мы будем таки редиректить в Yii? но тогда
Запрещаем "прямой" доступ к любой подпапке папки "upload"
не будет работать?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Защита папки upload

Сообщение Nex-Otaku »

пункт 6 - как вебсервер будет сравнивать user51 и XYZ - откуда он знает об их соотвествии?
См. п.7, соответствие прописано в .htaccess-файле в папке "/my-files/user51"
мы будем дописывать htaccess каждый раз как регистрируется пользователь?
Так тоже можно, но тогда ссылки будут неизменными, а значит доступны любому пользователю. Поэтому файл перезаписывается в момент авторизации пользователя, а не регистрации. Так мы обеспечиваем, что ссылки работают только в пределах сессии пользователя.
что если за статику отвечает нжинкс?
Либо придумать аналогичную схему для нжинкс, либо раздать эти файлы апачем ) Я не работал ещё с нжинкс. Он ведь умный и всё умеет?
тот же вопрос про ABC - откуда вебсервер знает текущий индификатор сессии клиента?
ABC не идентификатор сессии ) Хоть и хранится в тех же пределах. ABC генерируется специально для доступа к файлам и используется только для этого.
Вебсервер "знает" из .htaccess-файла в папке "/my-files/user51", этот файл подключается автоматом при обработке соответствующего запроса с помощью специальных правил. См. п.7
но тогда
Запрещаем "прямой" доступ к любой подпапке папки "upload"
не будет работать?
Пользователь не сможет открыть
http://site.com/upload/XYZ/file1.jpg

Тем более, что "XYZ" пользователю будет неизвестно в принципе.

Но сможет открыть
http://site.com/my-files/user51/ABC/file1.jpg
который втайне от пользователя будет преобразован вебсервером в
http://site.com/upload/XYZ/file1.jpg
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Защита папки upload

Сообщение Balu »

Всем спасибо!
Ответить