Как закрыть лазейку, выдающим все файлы

Любая помощь по установке/настройке/модификации concrete5

Как закрыть лазейку, выдающим все файлы

Сообщение guyasyou » 25 мар 2013, 11:40 ,  »  Сообщение:#1

Так как делаю интернет-магазин, продающий цифровой товар, внимание к безопасности файлов повышенная.
Но вот подложили проблемную фичу:
Пожалуйста зарегистрируйтесь, чтобы увидеть ссылку
, где 841 $fID файла. Просто подставляя $fID можно скачать все товары.
Как закрыть эту дыру? Надо закрыть именно эту дырку download_file. Ну и если знаете еще подобные возможности скачивания файлов- напишите.
Устанавливал Permissions для View файлов. он блочит тогда все, даже галереи перестают фотки показывать.
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск

Re: Как закрыть лазейку, выдающим все файлы

Сообщение cmsservice » 25 мар 2013, 13:37 ,  »  Сообщение:#2

Мы похожую штуку делали. Я сейчас уже не вспомню как именно, но навскидку два способа:
1. Устанавливать на файл пароль и его отдавать покупателю, пароль генерировать для каждого файла индивидуально. Запрос пароля в синглпейдже download_file и в соответствующем контроллере уже реализованы. Нужно сделать только автоматическую генерацию паролей для каждого файла (например с помощью Job'а).
2. У Вас же, чтобы купить человек должен выполнить вход на сайт, что логично для цифровых товаров. Т.о., можно сделать функционал, который хранит для каждого юзера его покупки (он вроде бы есть) и перекрыв контроллер download_file.php в нем проверять может ли данный юзер скачать это файл. Понятное дело, что нужно запретить скачивание этой группы файлов для всех, кроме группы покупателей магазина и админов :)
С уважением, Константин
http://Переделка-сайтов.РФ
Индивидуальные решения на платформе Concrete5 для театров и производственно-торговых компаний.
Аватара пользователя
cmsservice
 
Сообщения: 763
Зарегистрирован: 10 окт 2010, 00:10
Откуда: Москва

Re: Как закрыть лазейку, выдающим все файлы

Сообщение guyasyou » 25 мар 2013, 20:19 ,  »  Сообщение:#3

А закрыть single_page download_file не решит проблему? По моему, именно он выдает файлы по такой ссылке.

UPD: Для теста, просто удалил контроллер этой страницы - вроде ок. При попытке скачать ошибка, а остальные функции сайта пользуются file.php, а не им, поэтому все робит.
Переопределил controller, поломал функции его и терь все ок :D
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск

Re: Как закрыть лазейку, выдающим все файлы

Сообщение guyasyou » 26 мар 2013, 10:21 ,  »  Сообщение:#4

Тока вот теперь проблемно будет воспользоваться функционалом типа forceDownload для просто раздаваемых вещей. Нашел иное решение. Пусть эта лазейка будет таким какая есть, но вместо fID, будем передавать его зашифрованный вариант. Если шифровать через встроенную функцию ecnrypt(), то может выпасть такой шифр "NVPA3gcf/is=", так как данные передаются в ссылке, этот слеш мешается очень)) Какую можете предложить альтернативу?

UPD: узнал, что там из символов могут быть только /, + и =. + и = не страшны, а / я заменяю на *slesh*. Все робит
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск

Re: Как закрыть лазейку, выдающим все файлы

Сообщение Count_Raven » 27 мар 2013, 18:50 ,  »  Сообщение:#5

guyasyou писал(а):Какую можете предложить альтернативу?

Ну я же тебе объяснял уже эту тему.

Для того, чтобы передавать в ссылке запрещенные символы используются функции urlencode и urldecode.

Например генерируем ссылку с твоим кодом и предварительно код обрабатываем urlencode. Все, ссылка в браузере рабочая.
Когда юзверь кликает по ссылке, скрипт, который получает данные, обрабатывает их urldecode и получает код в первоначальном состоянии.

Ну а теперь по теме вопроса:
Я бы реализовал таким образом - создал бы атрибут для файлов, к примеру is_product. Т.е. те файлы, у которых он установлен - считаются товарами и к ним подход особый, остальные нам безразличны - обычные файлы.
Потом переопределил бы контроллер download_file и в нем бы сделал проверку.
Т.е. пользователь запрашивает файл
Пожалуйста зарегистрируйтесь, чтобы увидеть ссылку

Происходит проверка, если у этого файла установлен атрибут is_product, то мы проверяем имеет ли данный пользователь право на скачу этого файла - есть он у него в покупках и т.д. Если не имеет - выдаем ему сообщение о том, что он ошибся дверью.
Если у этого файла не включен атрибут is_product - все выполняется как обычно в контроллере download_file.

По сути 10 строк кода и все. Включить атрибут сразу у кучи файлов тоже можно (т.е. если существует уже много товаров, то не придется каждый по одному мучить). 15 минут работы и без изобретения большого велосипеда.
Country Amiant - Regno All Rianto
Аватара пользователя
Count_Raven
Супермодератор
 
Сообщения: 1156
Зарегистрирован: 06 окт 2010, 15:00
Откуда: Country Amiant

Re: Как закрыть лазейку, выдающим все файлы

Сообщение guyasyou » 27 мар 2013, 19:17 ,  »  Сообщение:#6

Эта проблема уже решена. Я думал конечно сделать на основе пермиссионов, суть та же. но это лишняя ручная работа для пользователей сайта. это каждый раз, добавляя файл, они должны тото там отмечать и настраивать. А так добавляйте как хотите. Я полностью заблокировал выдачу файлов без ведома администратора. тоесть если надо что-то выдать, то ставиться специальный модуль, который я смастерил, а он выдает ссылки с шифром, и файл выдается
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск


Вернуться в Помощь по concrete5

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron