Apache Download: убедитесь, что страница была просмотрена перед загрузкой - PullRequest
1 голос
/ 10 сентября 2008

Работа под рукой:

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

Есть ли какие-либо предложения, которые лучше, чем моя идея, отправить файл cookie и - перед началом загрузки - проверить, существует ли файл cookie (через .htaccess)?

Веб-страница и файлы для загрузки будут расположены на разных серверах.

Окружающая среда:

  • Apache 2 на всех машинах
  • PHP 5 на всех машинах
  • MySQL 5 доступен на сервере "веб-страницы" (нет доступа с серверов загрузки)

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

Ответы [ 6 ]

5 голосов
/ 10 сентября 2008

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

2 голосов
/ 10 сентября 2008

Apache mod_rewrite RewriteRule может сделать это.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www.example.com/page.html$
RewriteRule file.exe http://www.example.com/page.html [R=301,L]

В основном, если запрос на file.exe не пришел с page.html в качестве реферера, он 301 перенаправит пользователя на page.html.

1 голос
/ 12 сентября 2008

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

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

cookievalue = sha1('secretvalue'.date('z-H'));

Когда пользователь запрашивает фактический файл, файловый сервер снова генерирует этот файл cookie и проверяет, соответствует ли он пользователям. Это означает, что даже если пользователь подделает cookie-файл, он будет недействительным через час, поэтому кому это нужно, и он не сможет сгенерировать свой новый, потому что не знает секретного значения.

1 голос
/ 10 сентября 2008

Вы можете использовать распределенные серверные сеансы сессий вместо файлов cookie, но это, вероятно, больше проблем, чем стоит.

Вы также можете запретить доступ к запросам без реферера или с неверным реферером. Но это даже более поддельно, чем печенье.

Это будет зависеть от того, насколько ты заботишься.

0 голосов
/ 17 ноября 2009

Я собираюсь использовать mod_auth_token , чтобы убедиться, что у пользователя есть "недавняя ссылка".

С помощью mod_auth_token вы можете создавать ссылки с истекающим сроком действия, то есть, если кто-то решит взять существующую ссылку и опубликовать ее на другом веб-сайте, срок действия этой ссылки истечет через указанное время. Это приведет к 403 ЗАПРЕЩЕНИЮ, который я смогу перехватить и перенаправить пользователя на HTML-страницу, на которой он мне нужен.

0 голосов
/ 12 сентября 2008

Я собирался предложить реферальный трюк .htaccess, но это не очень безопасный метод. Создать скрипт PHP легко, добавив пользовательский http-реферал. Если вы зайдете на страницу загрузки, она будет думать, что вы пришли с этой страницы.

Это актуальная проблема? Можете рассказать что-нибудь о контексте вашей страницы загрузки?

...