Annotation of embedaddon/lighttpd/doc/outdated/secdownload.txt, revision 1.1.1.2
1.1 misho 1: ===========================
2: Secure and Fast Downloading
3: ===========================
4:
5: -----------------------
6: Module: mod_secdownload
7: -----------------------
8:
9: :Author: Jan Kneschke
10: :Date: $Date: 2004/08/01 07:01:29 $
11: :Revision: $Revision: 1.1 $
12:
13: :abstract:
14: authenticated file requests and a countermeasure against
15: deep-linking can be achieved easily by using mod_secdownload
16:
17: .. meta::
18: :keywords: lighttpd, secure, fast, downloads
19:
20: .. contents:: Table of Contents
21:
22: Options
23: =======
24:
25: ::
26:
27: secdownload.secret = <string>
28: secdownload.document-root = <string>
29: secdownload.uri-prefix = <string> (default: /)
30: secdownload.timeout = <short> (default: 60 seconds)
31:
32: Description
33: ===========
34:
35: there are multiple ways to handle secured download mechanisms:
36:
37: 1. use the webserver and the internal HTTP authentication
38: 2. use the application to authenticate and send the file
39: through the application
40:
41: Both ways have limitations:
42:
43: webserver:
44:
45: - ``+`` fast download
46: - ``+`` no additional system load
47: - ``-`` inflexible authentication handling
48:
49: application:
50:
51: - ``+`` integrated into the overall layout
52: - ``+`` very flexible permission management
53: - ``-`` the download occupies an application thread/process
54:
55: A simple way to combine the two ways could be:
56:
57: 1. app authenticates user and checks permissions to
58: download the file.
59: 2. app redirects user to the file accessable by the webserver
60: for further downloading.
61: 3. the webserver transfers the file to the user.
62:
63: As the webserver doesn't know anything about the permissions
64: used in the app, the resulting URL would be available to every
65: user who knows the URL.
66:
67: mod_secdownload removes this problem by introducing a way to
68: authenticate a URL for a specified time. The application has
69: to generate a token and a timestamp which are checked by the
70: webserver before it allows the file to be downloaded by the
71: webserver.
72:
73: The generated URL has to have the format:
74:
75: <uri-prefix><token>/<timestamp-in-hex><rel-path>
76:
77: <token> is an MD5 of
78:
79: 1. a secret string (user supplied)
80: 2. <rel-path> (starts with /)
81: 3. <timestamp-in-hex>
82:
83:
84: As you can see, the token is not bound to the user at all. The
85: only limiting factor is the timestamp which is used to
86: invalidate the URL after a given timeout (secdownload.timeout).
87:
88: .. Note::
89: Be sure to choose a another secret than the one used in the
90: examples, as this is the only part of the token that is not
91: known to the user.
92:
93:
94:
95: If the user tries to fake the URL by choosing a random token,
96: status 403 'Forbidden' will be sent out.
97:
98: If the timeout is reached, status 408 'Request Timeout' will be
99: sent. (This does not really conform to the standard, but should
100: do the trick).
101:
102: If token and timeout are valid, the <rel-path> is appended to
103: the configured (secdownload.document-root) and passed to the
104: normal internal file transfer functionality. This might lead to
105: status 200 or 404.
106:
107: Example
108: =======
109:
110: Application
111: -----------
112:
113: Your application has to generate the correct URLs. The following sample
114: code for PHP should be easily adaptable to any other language: ::
115:
116: <?php
117:
118: $secret = "verysecret";
119: $uri_prefix = "/dl/";
120:
121: # filename
122: $f = "/secret-file.txt";
123:
124: # current timestamp
125: $t = time();
126:
127: $t_hex = sprintf("%08x", $t);
128: $m = md5($secret.$f.$t_hex);
129:
130: # generate link
131: printf('<a href="%s%s/%s%s">%s</a>',
132: $uri_prefix, $m, $t_hex, $f, $f);
133: ?>
134:
135: Webserver
136: ---------
137:
138: The server has to be configured in the same way. The URI prefix and
139: secret have to match: ::
140:
141: server.modules = ( ..., "mod_secdownload", ... )
142:
143: secdownload.secret = "verysecret"
144: secdownload.document-root = "/home/www/servers/download-area/"
145: secdownload.uri-prefix = "/dl/"
146: secdownload.timeout = 120
1.1.1.2 ! misho 147: secdownload.algorithm = "md5"
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>