Re: URL с временными токенами

Igor Sysoev igor на sysoev.ru
Пт Май 14 17:04:48 MSD 2010


On Thu, May 13, 2010 at 06:40:01PM +0400, Maxim Dounin wrote:

> Hello!
> 
> On Thu, May 13, 2010 at 05:39:19PM +0400, Igor Sysoev wrote:
> 
> > On Thu, May 13, 2010 at 05:20:03PM +0400, Михаил Монашёв wrote:
> > 
> > > Здравствуйте, Максим.
> > > 
> > > >> > s> и особенно NginxHttpSecureDownload выглядят многообещающе.
> > > >> > 
> > > >> > Модуль Игоря будет работать при обновлении nginx-а. А вот модуль
> > > >> > сторонних разработчиков я б не использовал, хотя он и есть именно то,
> > > >> > что тебе нужно...
> > > >> 
> > > >> Я сейчас планирую добавить в ngx_http_secure_link_module функциональность
> > > >> с временем и finger print'ом. Что-то вроде
> > > >> 
> > > >> /prefix/MD5/TIME/FINGERPRINT/url
> > > >> /prefix/MD5/TIME/url
> > > >> /prefix/MD5/url
> > > >> 
> > > >> Для кодирования MD5, TIME и FINGERPRINT будет использоваться вариант
> > > >> base64 для URL (где "+" и "/" заменены на "-" и "_").
> > > >> 
> > > >> Директивы:
> > > >> 
> > > >>    secure_link_base64  [on|off|4|8|12];
> > > >> 
> > > >> off - совместимость с текущим ngx_http_secure_link_module.
> > > >> 4|8|12 - кодировать только часть хэша MD5.
> > > >> 
> > > >>    secure_link_expire  [on|off];
> > > >> 
> > > >>    secure_link_fingerprint  [off|строка];
> > > >>    secure_link_fingerprint 
> > > >> "$http_user_agent$remote_addr$http_accept";
> > > >> 
> > > >> FINGERPRINT считает MD5 от указанной строки и кодирует его в base64.
> > > >> 
> > > >> Ещё думаю над вариантом, когда MD5, TIME и FINGERPRINT передаются только
> > > >> в куке.
> > > 
> > > MD> Ещё pls подумай над вариантом передавать это всё в аргументах.  
> > > MD> Куки подходят не всегда, а настройка для аргументов(та) будет 
> > > MD> существенно проще и понятнее (не говоря уже о всякой последующей 
> > > MD> стастике и т.п.).
> > > 
> > > Угу. Источник для MD5, TIME и FINGERPRINT было бы удобно задавать.
> > > Например также, как сейчас задаётся secure_link_fingerprint
> > 
> > Тогда возможен такой вариант:
> > 
> > Формат ключа - MD5:TIME:FINGERPRINT 
> > 
> > MD5 считается так:
> > 
> >  md5(time . crc32(fingerprint) . protected URI)
> > 
> > Время и crc32 в littel endian.
> > Время 4 байта: time() - число секунд на 1.01.2010 от epoch
> 
> Я бы всё-таки рекомендовал время строкой в секундах с начала 
> эпохи.
> 
> И может быть md5 вообще считать не от чего-то конкретного, а от 
> произвольной строки формируемой из переменных (всё равно 
> "protected URI" задавать, см. ниже).
>
> > В URLе - /acbdefgd:acbdefg:abcdefg/file.zip
> > 
> > location ~ ^/(?<secure>[^/]+)(?<file>/.+)$ {
> >     secure_link          $secure;
> >     secure_link_base64   8;
> >     secure_link_expire   on;
> >     secure_link_fingerprint  "$http_user_agent$remote_addr$http_accept";
> >     alias        /path/to/$file;
> > }
> 
> Тут надо ещё задавать что подписываем.  В текущем варианте 
> подписывается $file, но в приведённом конфиге secure link'у никак 
> об этом не сообщается.

Да, protected URI нужно как-то задавать. Что-то вроде

     secure_link_uri      $file;

со значением по умолчанию

     secure_link_uri      $uri;

Что касается, произвольного md5, то его надо как-то так:

     secure_link_md5   $secure_link_time:$secure_link_fingerprint:$uri;


-- 
Игорь Сысоев
http://sysoev.ru



Подробная информация о списке рассылки nginx-ru