文書化されていないsecure_link機能

バージョン0.8.50以降、Nginxのsecure_linkモジュールは、リンクを偽造から保護する点で大幅に改善されています。 奇妙なことに、新しい機能はまだ公式ドキュメントに反映されていません[ 1 ]。 英語の説明はNginxコミュニティのWebサイト[ 2 ]にあり、これらの変更に関するSysoyevの説明[ 3 ]にもあります。 安全なリンクを生成するためのPHPコードは、nginxフォーラムにあります[ 4 ]。
一般的に、イノベーションは次のようになります。

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

Source: https://habr.com/ru/post/J120907/


All Articles