Перейти к публикации

Рекомендованные сообщения

Возник такой вопрос, есть файлы находящиеся к примеру в папке www.сайт.домен/фтп/тут мои файлы. Добавляя в новость линки на скачивание я имею:

www.сайт.домен/фтп/файл

И если юзер скопирует мою ссылку и просто передаст другому или вставит себе на сайт, то все смогут это скачать. Каким образом возможно реализовать чтоб ссылки генерировались индивидуально каждому юзеру и жили к примеру всего 1-н день.

Ссылка на сообщение
Поделиться на других сайтах

Для этого заводится отдельный скрипт который будет выдавать все файлы. Пусть это будет download.php

Сначала где то в другом скрипте (ну напрмер если эти файлы оплачиваются, то в скрипте который принял оплату) генерируем ссылку для файла и записываем ее в базу.

Например она имеет такой вид:

http://some_host/download.php?id=akf35kd5kanxc6m23n6oasi5mdfso3ncv2kg
Тогда в базе данных в какой нибудь таблице будет запись, примерно такая
URL			 |	link_id

ftp/file1.rar  |	akf35kd5kanxc6m23n6oasi5mdfso3ncv2kg

Тогда скрипт download.php извлекает из базы по параметру link_id путь к файлу и выдает его для скачивания.

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

с помощью .htaccess запретить доступ к файлам с любого ip кроме 127.0.0.1. Тогда файлы сможет читать лишь сервер.

P.S. многие даже очень авторитетные сайты не учитывают последний пункт. В качестве примера - vkontakte.ru Если например человек закрыл от вас просмотр какой либо фотографии, то это не означает что ее нельзя посмотреть. Если знать прямую ссылку на фото, то она успешно откроется. Например ваш друг который имеет доступ к фото, может скинуть вам прямую ссылку и тогда можно смело наплевать на все запреты. Ну разве что коментарий нельзя будет оставить...

Ссылка на сообщение
Поделиться на других сайтах

енерируем ссылку для файла и записываем ее в базу.
зачем ссылку записывать ,если по условиям она должга быть индивидуальная каждому пользователю, а значит генерироваться на лету.

А всё остальное верно..

Ссылка на сообщение
Поделиться на других сайтах

Да, используем сервис smszamok, поэтому и хотим защитить линки. В этом я особо не силен, поэтому не очень понял. Возможно есть какие либо готовые решения, которые бы было возможно использовать? Ссылки для оплаты мы скрываем в тегах [hide] Хотя саму идею предложенную Вами я понял, но как это реализовать я не понимаю.

Ссылка на сообщение
Поделиться на других сайтах

Так ясное дело при генерации проверяем чтобы она не совпала с другими (уже имеющимися).

Чтобы ссылка работала для определенного пользователя в базу допишем id этого юзера. Скрипт тогда будет проверять соответствие link_id и user_id одновременно. То есть если такой то юзер и мы обращаемся по такой то ссылке, то тогда нам дадут скачать файл.

Я делал так: генерируем и смотрим есть ли уже такая. Если нет, то генерируем новую и опять проверяем. Но на самом деле если файлов не так много (скажем пару тысяч), то совпадение случайных фраз крайне редкое явление.

И еще нужно вставить чистку старых ссылок.

Я просто опустил эти пункты. Хотел просто показать идею не вдаваясь в подробности

Если вы сами не справитесь, то за $$$ я готов помочь с реализацией. О цене договоримся.

Изменено пользователем wawilon
Ссылка на сообщение
Поделиться на других сайтах

Так ясное дело при генерации проверяем чтобы она не совпала с другими (уже имеющимися).
смотря какую ссылку генерировать.

Если такую...

http://files.site.ru/25/4f6fec50282f7956b8.../super_kino.avi - то она даже теоретически будет уникальной ;)

25 - это ID файла

4f6fec50282f7956b8fdbe12bebe4e8f - хэш, уникальный для каждого пользователя и действительный оперделённое время, например сутки

super_kino.avi - имя файла

а в БД хранится только ключ, длинной скажем 5 символов.

как это реализовать я не понимаю.
заплати wawilon'у денег и он тебе реализует
Ссылка на сообщение
Поделиться на других сайтах

lifestar, твоя идея понятна, но зачем нам столько параметров в ссылке?

Мы можем обойтись лишь хешем. А по этому хешу получить всю необходимую нам информацию. Ведь для безопасности лучше даже чтобы пользователь ничего не знал о файле, лишь только хеш.

Ссылка на сообщение
Поделиться на других сайтах

Если файлов очень много то поиск в БД по целочисленному ID выполняется быстрее, чем по текстовому полю. Да и вообще выборка по ID для меня считается хорошим тоном))

Ну и потом мы ничего не теряем от этих параметров, имя файла скорее для красоты ссылки конечно - да и человеку понятно если вдруг забыл куда ведёт эта ссылка, это так полезные мелочи.

Плюс при неправильном хэше (поддельном), мы вообще не обращаемся к БД - сразу выдаём ошибку. А если хэш правильный - получаем ссылку, прописываем в .htaccess дату и отдаём файл :)

Чтобы ссылка работала для определенного пользователя в базу допишем id этого юзера. Скрипт тогда будет проверять соответствие link_id и user_id одновременно. То есть если такой то юзер и мы обращаемся по такой то ссылке, то тогда нам дадут скачать файл.

Я делал так: генерируем и смотрим есть ли уже такая. Если нет, то генерируем новую и опять проверяем. Но на самом деле если файлов не так много (скажем пару тысяч), то совпадение случайных фраз крайне редкое явление.

И еще нужно вставить чистку старых ссылок.

здесь в принципе нормальный подход, но как то замудрённо, что лишне. Причём я так и не понял - где хранится ссылка для каждого пользователя? Изменено пользователем lifestar
Ссылка на сообщение
Поделиться на других сайтах

Все ссылки хранятся в отдельной таблице скажем в таком виде:

link_id											  |	user_id	|	file_path

4f6fec50282f7956b8fdbe12bebe4e8f	|	15		   |	files/some_file.mp3
Сама ссылка будет иметь примерно такой вид: http://host/download/4f6fec50282f7956b8fdbe12bebe4e8f Скрипт сделает запрос к базе и извлечет путь к файлу:
SELECT file_path ... WHERE user_id = id_залогинившегося_юзера  AND link_id = 4f6fec50282f7956b8fdbe12bebe4e8f

Путь к файлу знаем. Открываем его, прописываем заголовки и отдаем на скачку.

Из твоего поста мне не понятно, что значит "если хеш правильный"? Как ты это определишь не обратившись к базе?

И еще что значит "прописываем в .htaccess дату". Что ты хотел этим сказать?

здесь в принципе нормальный подход, но как то замудрённо, что лишне.

Предложи свой способ генерации случайной уникальной ссылки.

Да и еще:

Да и вообще выборка по ID для меня считается хорошим тоном))

Этим ты только сказал, что параметр для ссылки должен содержать лишь цифры, а не быть например 4f6fec50282f7956b8fdbe12bebe4e8f. Либо предлагаешь вообще отказаться от случайной строки и ограничиться только лишь ID, но так будет не правильно. Тогда вообще теряется весь смысл случайной строки.

Ссылка на сообщение
Поделиться на других сайтах

ааа, всё - я понял систему. Твой метод хорош для платного контента где нам надо знать кому разрешено качать, мой вообще как антилич где просто генерируется уникальная ссылка. Как? Да просто - придумываем некую формулу по которой и генерируем, в параметры включить что-нибудь от пользователя (например ID или логин), ID файла, можно время + ключевое слово/фразу. И проверять :)

Если хэш верный, в куки записать что-нибудь + в .htaccess в папке с файлом прописать набор правил из HTTP_REFERER, HTTP_COOKIE, REMOTE_ADDR, TIME_DAY, TIME_HOUR - по выбору. Далее пользователю выдаётся прямая ссылка на файл - качай нехочу)

Таким образом для скачивания файла не используем PHP вообще, ибо если это PHP+качаем фильм - жалко сервер :)

А если установлен mod_redirect - жизнь становится ещё проще - тогда и прямая ссылка на файл останется неизвестной!

Ссылка на сообщение
Поделиться на других сайтах

Ну да. Я понял тебя. В каких-то случаях удобная схема. Только:

1. В уникальную ссылку я бы не стал запихивать дату, поскольку еще придется вспоминать когда мы ее генерировали (то есть придется куда то записать). Иначе эта схема возможна если хеширование не однонаправленное, например все шифруем base64, что не является безопасным.

2. REMOTE_ADDR я бы не стал писать в правила, поскольку IP адрес не является показателем и будет даже лучше если один и тот же пользователь может скачивать файл с другого IP. Особенно в случае динамического IP (например Dial-up модем).

3. Ты точно имел ввиду mod_redirect? может все же mod_rewrite?

Если точно, то поясни пожалуйста что делает mod_redirect. И в чем отличие от mod_rewrite?

Ссылка на сообщение
Поделиться на других сайтах

1. В уникальную ссылку я бы не стал запихивать дату, поскольку еще придется вспоминать когда мы ее генерировали (то есть придется куда то записать). Иначе эта схема возможна если хеширование не однонаправленное, например все шифруем base64, что не является безопасным.
никаких base64 - а дату необязательно, её можно включить в формулу если ссылка временная и валидна скажем 1 час

2. REMOTE_ADDR я бы не стал писать в правила, поскольку IP адрес не является показателем и будет даже лучше если один и тот же пользователь может скачивать файл с другого IP. Особенно в случае динамического IP (например Dial-up модем).
поменялся ай пи - генерируй ссылку заново и менеджер закачки начнёт продолжать закачку :)

А если не продолжит - чтож поделать - заново)

3. Ты точно имел ввиду mod_redirect? может все же mod_rewrite?

Если точно, то поясни пожалуйста что делает mod_redirect. И в чем отличие от mod_rewrite?

блин я ошибкся прости - конечно же mod_proxy! С ним жизнь малина! :D Изменено пользователем lifestar
Ссылка на сообщение
Поделиться на других сайтах

поменялся ай пи - генерируй ссылку заново и менеджер закачки начнёт продолжать закачку

А если не продолжит - чтож поделать - заново)

Мне кажется это глупо. С одного ай-пи качать или с разных абсолютно нет разницы. Получается мы просто создаем пользователю больше проблем.

Мне тут вспомнилась одна история в тему:

Когда то давно, когда все сидели на dial-up'ах один провайдер сделал такую фишку (на свою голову похоже). Вообщем он сказал что первые 15 секунд соединения бесплатны. Далее одна умная голова в лице моего друга, написала скрипт редиалера ))) Вообщем скрипт дозавнивался до провайдера, ждал 15 секунд, разрывал связь и снова звонил. На дозвон уходило 5-10 секунд. А в результате - абсолютно безплатный интернет!!! =))))) с небольшими постоянными разрывами ))

Я тут представил как бы он за 15 секунд по быстрому генерил бы новую ссылку и докачивал бы файл ))

А вообще эта история так... оффтоп

Ссылка на сообщение
Поделиться на других сайтах
  • 5 недель спустя...

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...