Автор: | Jan Kneschke |
---|---|
Дата: | 2004-08-01 |
Версия: | 1.1 |
Суть
с помощью этого модуля можно позволить скачивание файлов пользователям прошедшим аутентификацию, на некоторое время
secdownload.secret = <string> secdownload.document-root = <string> secdownload.uri-prefix = <string> (по умолчанию: /) secdownload.timeout = <short> (по умолчанию: 60s)
имеется несколько способов обеспечить безопастное скачивание файлов:
Оба способа имеют свои ограничения:
web-сервер:
приложение:
Простейшим способом объединить оба подхода в один может быть:
Так как web-сервер ничего не знает о правах доступа используемых в приложении, полученный URL может использоваться каждым пользователем знающем его.
mod_secdownload ликвидирует эту проблему аутентификацией к определённому URL на определённое время. Приложение создаёт "билет"(token) и "отметку о времени"(timestamp) которые проверяются web-сервером прежде чем дать доступ к файлу.
Полученный URL имеет слудующий формат:
<uri-prefix><token>/<timestamp-in-hex><rel-path>
<token> это контрольная сумма(MD5) из
Как видите билет не полностью ограничивает пользователя. Единственным лимитирующем фактором является временная метка, определяющая возможность использования этого 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); ?>
server.modules = ( ..., "mod_secdownload", ... ) secdownload.secret = "verysecret" secdownload.document-root = "/home/www/servers/download-area/" secdownload.uri-prefix = "/dl/"