バージョン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;
引数と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