Как реализовать защиту от прямых ссылок на скачивание?

storng

Новичок
Как реализовать защиту от прямых ссылок на скачивание?

Здравствуйте, уважаемые.

Возникла такая задача: На сайте есть файл, который могут скачивать посетители этого сайта.
Но мне хотелось бы, что бы не давали прямых ссылок на этот файл, т.е. что бы не скачивали файл без посещения сайта. Как это лучше реализовать?
Возникла часть идеи:
На странице сайта при открытии заполняем сессию, далее в форму вешаем просто кнопку "скачать" и отсылаем на эту же страницу где проверяем ,скажем массив $_POST.
А дальше уже как-нибудь манипулировать header ?

Подскажите, пожалуйста, как мне это реализовать.
Можно с помощью кнопки, можно просто ссылкой, но как сделать так, что бы скачать файл можно было только посетив эту страничку ?

Спасибо.
 

storng

Новичок
Шерлок, спасибо !

Фaнaт ,ввёл не то, пусто было ,сейчас детализировал - нашёл,
сорри :(
 

Alexandre

PHPПенсионер
- в сессию пишем некий ключ например ($_SID[key]= $login.time() )
- в хидден переменную пишем мд5(ключ)
анализируем, чтоб совпадало
- login
- md5($_SID[key]) = $_POST[ключ]

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

storng

Новичок
Alexandre
А почему проще нельзя зачем использовать хидден переменную ?
Ну просто при открытии страницы записали в сессию ключ
нажали кнопку на форме (скачать файл)
смотрим тупо в начале скрипта - isset($_POST['submit'])
если есть , проверяем сессию на наличие ключа
хотя, вообще даже, нужна ли сессия если можно через форму всё сделать?
 

Stalone

Новичок
У меня та же тема, но вопрос в другом:

Можно ли зашифровать (и потом разшифровать) строку (base64_encode) , чтобы она в зашифрованном виде была не больше, скажем 20 знаков?
Не используя при этом базу или файлы для хранения зашифрованной строки.
Чтобы было не так много знаков в адресной строке:

encrypted: 49YnL985FoHtL6UMxZ4YDaMTnDBa9aC1Qt2e1Ewf0FvsMTzfI0Fx8obWpr9RiJOfPrJ8evKEc
(decrypted: 32536236353523152366262362362627627sometext)

а, хотябы столько:

encrypted: jkDi35kzGoj9Rx822Ec
(decrypted: 32536236353523152366262362362627627sometext)
 

kruglov

Новичок
Stalone
Пишете идеальный архиватор? Чтоб мегабайт ужимал в 20 байт? Напишете, подавайте заявку на нобелевскую.
 

Alexandre

PHPПенсионер
Можно ли зашифровать (и потом разшифровать) строку (base64_encode) , чтобы она в зашифрованном виде была не больше, скажем 20 знаков?
тогда строка должна быть не больше 10-16 знаков (точно не скажу...)
 

Alexandre

PHPПенсионер
А почему проще нельзя зачем использовать хидден переменную ?
Ну просто при открытии страницы записали в сессию ключ
в принципе -можно...
но, можно запомнить сид, и с этим сидом брать ссылки длительное время.
сессионные файлы живут долго, и умирают по истечению некоторого времени после последнего обращения.

по этому, добавление некоторой соли в хидден переменную - увеличивает надежность от скачивания роботами.
 

MiksIr

miksir@home:~$
Поделюсь ;)
Когдааа еще не было всяких там nginx, а нада было отдавать файло по временным ссылкам... ну даже тогда мне в голову не приходило отдавать их скриптом. По-этому делал хитрые штуки...
Само файло лежит в недоступной для веб части. При запросе на скачку скрипт делает в доступной части симлинк на нужный файл и дает туда редирект.
Что бы симлинки не ходили по рукам, во-первых они переодически удалялись (на основе анализа mtime/atime), а во-вторых в симлинке был прописан IP пользователя... и еще какая-то информация, уж не вспомню (вполне можно попробовать на куки завязаться). При запросе на этот симлинк правилами mod_rewrite проверялось совпадение параметров клиента (тот же IP) и записанное в ссылке, и если не совпадало - был отлуп с редиректом на форму запроса.
Вроде работало ;)
PS: почитал еще раз топикстартера. Для этих целей совсем не обязательно так городить.. достаточно проверять HTTP_REFERER
 

storng

Новичок
MiksIr
Спасибо за инфо, действительно используя HTTP_REFERER
в файле htaccess задача решается очень просто:


RewriteCond %{HTTP_REFERER} !^http://site.ru.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.site.ru.*$ [NC]
RewriteRule .rar$|.zip$ http://www.site.ru/ [R,L]
 

Gas

может по одной?
storng
только HTTP_REFERER не обязательный заголовок и многие firewalls фильтруют его.
 

MiksIr

miksir@home:~$
Угу, Gas прав, нужна еще одна проверка на пустой реферер.
 

storng

Новичок
хмм, грустно тогда,
через форму с кнопкой совсем не охото делать.
А тут всё говорили о антиличе и поиске, просмотрел всё что есть, везде в темах только одно упоминание "ищи в поиске антилич" =)
 
Сверху