Безопастное и Быстрое Скачивание Файлов

Модуль: mod_secdownload

Автор: Jan Kneschke
Дата: 2004-08-01
Версия: 1.1

Суть

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

Содержание

Опции

secdownload.secret        = <string>
secdownload.document-root = <string>
secdownload.uri-prefix    = <string>  (по умолчанию: /)
secdownload.timeout       = <short>   (по умолчанию: 60s)

Описание

имеется несколько способов обеспечить безопастное скачивание файлов:

  1. использовать web-сервер и внутреннюю HTTP-аутентификацию
  2. использовать для аутентификации отдельное приложение и отдавать файл через это же приложение

Оба способа имеют свои ограничения:

web-сервер:

приложение:

Простейшим способом объединить оба подхода в один может быть:

  1. приложение аутентифицирует пользователя и проверяет права доступа для скачивания файла .
  2. приложение перенаправляет пользователя имеющего права на скачивание файла к web-серверу
  3. web-сервер передаёт файл пользователю

Так как web-сервер ничего не знает о правах доступа используемых в приложении, полученный URL может использоваться каждым пользователем знающем его.

mod_secdownload ликвидирует эту проблему аутентификацией к определённому URL на определённое время. Приложение создаёт "билет"(token) и "отметку о времени"(timestamp) которые проверяются web-сервером прежде чем дать доступ к файлу.

Полученный URL имеет слудующий формат:

<uri-prefix><token>/<timestamp-in-hex><rel-path>

<token> это контрольная сумма(MD5) из

  1. секретной строки (данной пользователем)
  2. <относитьного пути> (начиная с /)
  3. <временной метки в hex>

Как видите билет не полностью ограничивает пользователя. Единственным лимитирующем фактором является временная метка, определяющая возможность использования этого URL в течении некоторого времени (secdownload.timeout).

Замечание

Не используйте secret данный в этих примерах так как это только часть билета неизвестного пользователю.

Если пользователь пытается использовать произвольный билет, то он получает от web-сервера сообщение 403 'Forbidden'.

Как только время использования билета истекло, клиент получает сообщение 408 'Request Timeout' (хотя это не совсем стандартное поведение web-сервера).

Если и билет и время его действия в порядке, берётся <rel-path> и добавляется в URL в соответствии с конфигурацией (secdownload.document-root) , пропуская клиента к нужному файлу. После этого шага коды возрата от web-сервера могут быть только 200 или 404.

Пример

Приложение

<?php

$secret = "verysecret";
$uri_prefix = "/dl/";

# имя файла
$f = "/secret-file.txt";

# метка с текущем временем
$t = time();

$t_hex = sprintf("%08x", $t);
$m = md5($secret.$f.$t_hex);

# получившаяся ссылка
printf('<a href="%s%s/%s%s">%s</a>',
       $uri_prefix, $m, $t_hex, $f, $f);
?>

Web-сервер

server.modules = ( ..., "mod_secdownload", ... )

secdownload.secret          = "verysecret"
secdownload.document-root   = "/home/www/servers/download-area/"
secdownload.uri-prefix      = "/dl/"