FAQ

Page Discussion History

HttpSecureLinkModuleJa

インストール | モジュール | アドオン | 設定 | コミュニティ | その他の情報源

Contents

概要

このモジュールは、リクエストされた URL がセキュリティトークンを必要とするかどうかをチェックします。 このモジュールはデフォルトではコンパイルされません。コンパイルする際は、nginx をコンパイルする際に

--with-http_secure_link_module

を引数として指定して configure する必要があります。このモジュールは nginx 0.7.18 以降でのみサポートされます。

利用例

想定外のところからリンクされたくない PDF ファイルを想像してみてください。これを実現するためには、ファイルにユニークなトークンと有効期限を追加する必要があります。ここではトークンと有効期限を生成するために、次のような PHP コードを用いました。 ハッシュを生成するために、PHP を次のようにして実行します。

$secret = 'segredo'; // ハッシュの再生成をより困難にします
$path   = '/p/files/top_secret.pdf'; // ユーザに送信するファイル
$expire = 1096891200; // ファイルの有効期限が到来する時刻。通常は time() + x 値を使用する
 
$md5 = base64_encode(md5($secret . $path . $expire, true)); // バイナリ形式のハッシュを利用する
$md5 = strtr($md5, '+/', '-_'); // + および / は URL において特殊文字として認識される。詳細は「参照」節でリンクした Wikipedia のページを参照のこと
$md5 = str_replace('=', '', $md5); // When used in query parameters the base64 padding character is considered special.

The expire time can obtained by using the time() function in PHP — or similar in other programming language — in order to obtain the Unix epoch.

これで、簡単には再生成できないハッシュと有効期限を入手しました。これをリンク対象のファイルに対して指定するには、次のようにします:

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

Nginx にこの URL を保護させるには、MD5 ハッシュを再生成させる方法を伝達する必要があります。これを次のようにして行います:

location /p/ {
    ## This must match the URI part related to the MD5 hash and expiration time.
    secure_link $arg_st,$arg_e;
 
    ## MD5ハッシュをシークレットトークン、URI (PHP の $path)、有効期限から生成する
    secure_link_md5 segredo$uri$arg_e;
 
    ## ハッシュが不正な場合、$secure_link は~文字列となる
    if ($secure_link = "") {
        return 403;
    }
 
    ## 現在のローカル時刻が指定された有効期限よりも大きい
    if ($secure_link = "0") {
        return 403;
    }
 
    ## If everything is ok $secure_link is 1.
}


ディレクティブ

secure_link

syntax: secure_link md5_hash[,expiration_time]

default: none

context: location

variables: yes


This directive specifies the MD5 hash value and the expiration time of this link URI. The md5_hash must be encoded using Base64 for URLs. expiration_time is the Unix epoch.

If no expiration_time is specified then the link never expires.

secure_link_md5

syntax: secure_link_md5 secret_token_concatenated_with_protected_uri

default: none

context: location

variables: yes


このディレクティブは MD5 のハッシュ対象となる文字列を指定します。文字列は上記の例のように変数を用いても構いません。ハッシュ値は secure_link ディレクティブで指定された md5_hash と比較されます。両者が合致する場合、$secure_link は 1 となり、それ以外の場合は空文字列となります。

secure_link_secret

Syntax: secure_link_secret word
Default:
Context: location
Reference:secure_link_secret


このディレクティブは、nginx 0.8.50 で secure_link_md5 により廃止予定となりました。

変数

$secure_link

この変数は、 secure_link_secret が用いられているかどうかで、異なる挙動を示します:

  • secure_link_secret が用いられており、リクエストされた URI が計算された MD5 ハッシュに適合する場合、$secure_link は保護された URI となります。それ以外の場合は空文字列となります。
  • secure_link および secure_link_md5 が用いられており、リクエストされた URI が計算された MD5 ハッシュに適合する場合、$secure_link は 1 となります。現在のローカル時刻が $expiration_time を超えた場合、$secure_link の値は 0 となります。それ以外の場合は空文字列となります。

$secure_link_expires

$expiration_time が指定された場合は、その値が設定されます。

参照