![]() |
Ограничение доступа к файлам через http
В общем требуется такой скрипт.
1) Пользователи авторизуются на сайте. 2) Можно давать разрешение на скачку определенных файлов и запрещать доступ к определенным файлам. Интересны будут ваши идеи насчет того, как ограничить доступ к фалам не использую htaccess |
Наверно скажу глупость но.... Может быть так же как на форуме? Допустим, человек решил скачать файл который не доступен для всех, при нажатии на ссылку скрипт будет проверять к какой группе человек относится, если к той группе которая разрешена то качает, если нет то выдает сообщение об ошибке...
Если я неправильно понял вопрос то растолкуй поподробнее.... Код вряд ли смогу написать но идейку могу подкинуть..... И ногами не бейте если что то не то написал... |
Некоторые вообще берут за основу сайта форумный движок.
|
Во первых на форуме часто фалы хранятся в базе. И тем самым ограничивается доступ к файлам. Если файлы хранятся не в базе, то имея прямую ссылку на файл его может скачать любой человек.
|
2Егорыч+++ то есть тебе нужно чтобы файлы были на серваке. Можно попробовать сделать динамический адрес с помощью mod_rewrite
Кстати вот например хост народ.ру как то же ограничивает свои файлы даже когда ты тыкаеш на прямую ссылку. Та же система на Рапидшаре... Может быть от этого оттолкнутся? |
Ну, может как вариант (не самый красивый), при начале скачивания, проверить - можно или нет пользователю скачивать, нет - пшел вон, можно - создается временный каталог (md5(дата)), в который копируется файл, после чего дается ссылка на скачку. Через день удаляется (запуск cron-ом).
|
А мне кажется, создать для определенного пользователя определенный список файлов, которые ему можно скачивать и генерировать временную уникальную ссылку, если хочет скачать его.
upd: censored! раньше написал :( |
Можно глянуть чужие скрипты. Как у них. Например, то что тебе надо: http://script.woweb.ru/index.htm/id/1052917030
Но в регете/флашгете будет светиться. Поэтому по-любому надо во временную папку пихать. |
С временной папкой впринципе интересное решение. Но может у кого еще будут какие идеи.
|
2Егорыч+++, а может быть не пихать во временную папку а каждому файлу создавать свою папку и раз в какой то промежуток времени ее переименовывать. Допустим каждый час или два... Так то наверно легче будет чем файлы бросать из одной папки в другую.
|
банальный антилич может заюать? )
|
а файл переименовывать?
как-то копался в движке интернет-магазниа музкой - у них папка, в которой статически(!) лежат все файлы, когда юзер файл покупает - нужный ему файл кладут в рандомную папку, которую просто потом удаляют через 12 часов. хотя можно и меньше времени давать... ЗЫ основная папка со всем контентом у них не была ничем защищена :) а алгоритм генерирования имени папки (новой) - приметивен (чтоб если файл качает 1000 юзеров - не копировать 1000 папок, а давать линк каждому один и тот же) (имя папки зависит от даты и от названия трека + слово (константа из конфигов)) |
Цитата:
Кстати: самый легкий способ по части нагрузки: сделать ярлык. |
Ярлык то ведет на реальный файл.
А если файл переименовывать - то хорошо когда один пользователь. А если их сто и они одновременно собираются качать - то скачает последний. Да и надо записывать где-нить какой файл как уже называется. антилич - он вроде не для скрытия ссылок, а для проверки - откуда пытаются скачать, и если не с сервера - посылать. |
А что если вот так
Цитата:
|
Цитата:
как это ссылки не помогают? а если это ссылка в файловой системе линуха? раскрывает путь на файл? а команда unlink по прошествии 12 часов? нерезус правильно про линки заметил! |
Наверное тут только один выход. Файл лежит где то там на серваке. Решил пользователь его скачать. Нажал на ссылку. Файл копируется из этого места где он лежал и переносится в только что созданную папку с случайным названием. А оттуда уже качается после скачки папка вместе с файлом удаляются.
|
Цитата:
|
Цитата:
это те не винда |
С копированием большой недостаток и с ярлыками тоже . Нельзя определить был скачен файл или нет для удаления этого.
|
Цитата:
|
Цитата:
Но с переименованием действительно лучше чем гонять-копировать. Раз в сутки все файлы переименовывать, и выдавать ссылку на скачку. Можно и не все. Если был за эти сутки запрос на скачивание - значит на следующие сутки он переименовывается. Цитата:
А файлы большие? Если мелкие - то сразу скачают после запроса на скачку, если фильмы какие-нить - то да. Многие за сутки не выкачают. Ну еще как вариант - это найти место где есть поддержка htaccess =) Или: заряжаешь архив с файлами троем, при запуске трой стучиться на сервер. Как трой стукнулся - файл можно удалять =)))))) |
А мой выриант чем неподходит??
|
Можно сделать как сделано на slil.ru. Сурсы дать не могу занимимением. Но рассказать как работает можно. там стоит опять же связка nginx+fast-cgi, которую я так люблю хвалить. nginx получает ссылку на архив с каким-то хешем. Передает его php. php сверяет хеш и есл все верно - посылает заголовок nginx`у (обычным header()) и тот отдает файл. Если хеш не сошелся - php ехит ошибку.
Сервис известнй и пользуют его многие. Благодаря данному хитрому но до ужаса простому антиличу стоит на обычном Celeron`е. |
Цитата:
но он оперативу жрет неслабо ) |
Цитата:
|
А можно так.
При инициативе пользователя скачать файл создается папка с названием типо хеша, и двумя файлами .htaccess и bublik.zip. Аксес с текстом <Files "bublik.zip"> AddType application/x-httpd-php .zip </Files> А пхп с миниавторизацией <?php if($_COOKIE[login]="Vasya" & $_COOKIE[sess]="cae6dac72fd4aw73f6ede7a1c6e7adaf") // ну или от форума прикрутить { разрешено скачивать // ну функция скачивания из хранилища с DENY FROM ALL (outside) } else { echo "Пошел вон"; } ?> |
Цитата:
|
Цитата:
|
без аксесса можно обойти создавая download.php
Ну а куки не знаю. В ReGet есть поддержка кукисов, боюсь что только Ослинных. |
2 Егорыч+++
нет, если делать через апач, файл будет отдавать php, а не веб-сервер. Там все внутри одной сессии. nginx получает запрос, отдает php на обработку и далее уже php либо отдает приказ nginx`у комманду на отдачу файла, либо извещает о ошибке. Не знаю как это реально реализовать на apache. Еще способ простой. Есть дира с именем, к пример, "8v9erjh9ver" и файл, в котором хронится адрес этой диры. Раз в 5 минут меняется имя диры и инфа в файле. В итоге можно будет скачать файл только через интерфейс + файл будет отдаваться веб-сервером, не сжирая ресурсы сервака. Тоже реалиховывал - работает как часы. Даже если имя диры меняется во время скачки файла - хедеры уже открыты и открытые докачаются. Удобно. Но есть проблема - если таким образом реализовывать файлообменник, на закачанный файл нельзя будет поствить пароль. Точнее можно, но обойти защиту пароля будет легко |
можно еще менять доменные имена... тупо :)
типа n1.m24.fer.ru :) |
если файл находиться в базе, то можно сделать так
в базе разграничить юзеров по группам. Сделать рандомную ссылку, по которой юзеры будут качать файл. Если другой юзер зайдет по этой сцылке, то естесна файла уже по ней не будет. Сделать просто одноразовую сцылку. Если по ней скачали, то она пустеет. Каждому другому юзеру будет генерироваться своя. В принципе это не так сложно реализовать |
только вот нагрузка будет не на фтп сервер а на апач основная и на базу... чего не очень то бы и хотелось!
|
Файл а базу? Бугага =))) прощай БД =))))))))) простите, если кого обидел. Подобные вещи надо бы знать. Реляционные БД не преднозначены для хронения в них бинарных данных =) для этого есть файловая система =)
|
не нравится мне ничего из того что предложили .. завтра сам напишу...
|
Цитата:
|
>>Файл а базу? Бугага =))) прощай БД =))))))))) простите, если кого обидел. Подобные вещи надо бы знать. Реляционные БД не преднозначены для хронения в них бинарных данных =)
ну а где же форумы хранят файлы? допустим булка? |
если интерестно виложу
_http://www.vibralogix.com/linklokcb/ |
Цитата:
тормоз всех реляционных БД - текстовые поля. Любое поле типа TEXT\BLOB в таблице будет ее сильно тормозить. А как БД относятся к бинарникам, я вообще молчу =) Это вы хотите 5 метров, допустим, из БД тянуть обним запросом? Приятно =)))))) |
| Время: 13:33 |