一般的に、イノベーションは次のようになります。
nginx.conf:
場所〜^ / p /(?<secure> [\ w-] +、\ d +)/(?<secured_stuff>。+)$ { secure_link $ secure; #この例では、 '$ secure' = "HASH、TIMESTAMP" secure_link_md5 PASSWORD $ secure_link_expires $ secure_stuff; # '$ secure_link_expires'は、 'secure_link' = TIMESTAMPからの10進数値を含むnginx変数です if($ secure_link = ""){return 403; }#無効なリンク if($ secure_link == 0){return 410; }#有効期限切れのリンク #リンクは問題ありません、ここで何かをしてください }
URLは次のようになります。/ p / HASH、TIMESTAMP / ANYTHING
PASSWORDシークレットパスワード
TIMESTAMPは、UNIXエポックのリンクが有効になるまでの時間です
任意のテキスト
secure_link_md5テンプレートからのbase64-URL [ 5 ] md5ハッシュにエンコードされたHASH(この例では$ secured_stuff = ANYTHING)。 base64の後の文字「=」は省略可能
Nginxには、md5の量を計算する際にいくつかの暗黙のニュアンスがあります。
1. URLからカウントするための文字列($ secured_stuff)は、元の形式のURLエンコードからデコードされます
2. base64でエンコードする場合は、md5ハッシュをバイナリ形式で送信する必要があります
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;
引数とCookieを使用して、ハッシュと時間を渡すこともできます。
ビューURL用
http://example.com/p/files/top_secret.pdf?st=PIrEk4JX5gJPTGmvqJG41g&e=1324527723
stは、PASSWORD、URI、および引数eからのハッシュです
場所を見る
場所/ p / { secure_link $ arg_st、$ arg_e; #これは、関連するURI部分と一致する必要があります secure_link_md5 PASSWORD $ uri $ arg_e; #PASSWORDは秘密トークンです .... }
推測するのは難しくありません。ハッシュを作成するときに、クライアントのIPアドレスを使用できます。
参照:
[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