Страница 1 из 1

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

СообщениеДобавлено: 25 мар 2013, 11:40
guyasyou
Так как делаю интернет-магазин, продающий цифровой товар, внимание к безопасности файлов повышенная.
Но вот подложили проблемную фичу:
Пожалуйста зарегистрируйтесь, чтобы увидеть ссылку
, где 841 $fID файла. Просто подставляя $fID можно скачать все товары.
Как закрыть эту дыру? Надо закрыть именно эту дырку download_file. Ну и если знаете еще подобные возможности скачивания файлов- напишите.
Устанавливал Permissions для View файлов. он блочит тогда все, даже галереи перестают фотки показывать.

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

СообщениеДобавлено: 25 мар 2013, 13:37
cmsservice
Мы похожую штуку делали. Я сейчас уже не вспомню как именно, но навскидку два способа:
1. Устанавливать на файл пароль и его отдавать покупателю, пароль генерировать для каждого файла индивидуально. Запрос пароля в синглпейдже download_file и в соответствующем контроллере уже реализованы. Нужно сделать только автоматическую генерацию паролей для каждого файла (например с помощью Job'а).
2. У Вас же, чтобы купить человек должен выполнить вход на сайт, что логично для цифровых товаров. Т.о., можно сделать функционал, который хранит для каждого юзера его покупки (он вроде бы есть) и перекрыв контроллер download_file.php в нем проверять может ли данный юзер скачать это файл. Понятное дело, что нужно запретить скачивание этой группы файлов для всех, кроме группы покупателей магазина и админов :)

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

СообщениеДобавлено: 25 мар 2013, 20:19
guyasyou
А закрыть single_page download_file не решит проблему? По моему, именно он выдает файлы по такой ссылке.

UPD: Для теста, просто удалил контроллер этой страницы - вроде ок. При попытке скачать ошибка, а остальные функции сайта пользуются file.php, а не им, поэтому все робит.
Переопределил controller, поломал функции его и терь все ок :D

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

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

UPD: узнал, что там из символов могут быть только /, + и =. + и = не страшны, а / я заменяю на *slesh*. Все робит

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

СообщениеДобавлено: 27 мар 2013, 18:50
Count_Raven
guyasyou писал(а):Какую можете предложить альтернативу?

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

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

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

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

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

По сути 10 строк кода и все. Включить атрибут сразу у кучи файлов тоже можно (т.е. если существует уже много товаров, то не придется каждый по одному мучить). 15 минут работы и без изобретения большого велосипеда.

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

СообщениеДобавлено: 27 мар 2013, 19:17
guyasyou
Эта проблема уже решена. Я думал конечно сделать на основе пермиссионов, суть та же. но это лишняя ручная работа для пользователей сайта. это каждый раз, добавляя файл, они должны тото там отмечать и настраивать. А так добавляйте как хотите. Я полностью заблокировал выдачу файлов без ведома администратора. тоесть если надо что-то выдать, то ставиться специальный модуль, который я смастерил, а он выдает ссылки с шифром, и файл выдается