nginx и secure_link

  Краткое содержание моей Недокументированные возможности secure_link на Хабре

nginx.conf:

location ~ ^/p/(?[\w-]+,\d+)/(?.+)$ {
     secure_link     $secure; 
     #  '$secure' = "HASH,TIMESTAMP"
     secure_link_md5      PASSWORD$secure_link_expires$secured_stuff;
     # '$secure_link_expires' has data after comma in 'secure_link' = TIMESTAMP

     if ($secure_link = "") { return 403; } # invalid link
     if ($secure_link == 0) { return 410; } # expired link
     
     # link is ok, do something here
}

URL выглядит как: /p/HASH,TIMESTAMP/ANYTHING где
PASSWORD секретный пароль
TIMESTAMP это время до которого действительна ссылка в unix epoch
ANYTHING произволный текст
HASH кодированный в base64-URL [5] md5 хэш из шаблона secure_link_md5 ($secured_stuff = ANYTHING в данном примере). Символы ‘=’ после base64 можно опускать

  Нюансы:
1. строка для подсчета из URL ($secured_stuff) декодируется из URL encoding в оригинальный вид
2. md5 хэш должен передаваться в бинарном виде для кодирования в base64

  код генерации хэша для PHP :

$time  = time() + EXPIRE_TTL; # = TIMESTAMP
$hash = md5(PASSWORD.$time.$secured_stuff, true);
$hash = strtr( base64_encode($hash), array( '+' => '-', '/' => '_', '=' => '' ));
$url    = 'http://example.tld/p/$hash.','.$time.'/'.$secured_stuff;

Для передачи хэша и времени можно также использовать аргументы и куки:
для URL вида

http://example.com/p/files/top_secret.pdf?st=PIrEk4JX5gJPTGmvqJG41g&e=1324527723

где агрумент st это хэш от PASSWORD, URI и аргумента e
location вида

location /p/ {
     secure_link $arg_st,$arg_e; # this must match the URI part related 
     secure_link_md5 PASSWORD$uri$arg_e; # PASSWORD is the secret token
     ....
}

Сcылки:
[1] sysoev.ru/nginx/docs/http/ngx_http_secure_link_module.html
[2] wiki.nginx.org/HttpSecureLinkModule
[3] nginx.org/pipermail/nginx/2010-September/022324.html
[4] forum.nginx.org/read.php?21,126363,128324#msg-128324
[5] en.wikipedia.org/wiki/Base64#URL_applications

Tags:

Leave a Reply