Nginx でファイル ホットリンク保護サービスを構築する方法を学ぶ例

Nginx でファイル ホットリンク保護サービスを構築する方法を学ぶ例

序文

多くのサイトが、ポイントやゴールドコインなど、情報のダウンロードに料金を請求していることは誰もが知っています。無料で入手できることは非常にまれです。では、これらの Web サイトはどのようにしてリソースのホットリンクを防止しているのでしょうか。

ここでは比較的使いやすいツールをお勧めします。Nginx 自体が secure_link を提供してアンチホットリンク機能を完成させており、これによりサーバーファイルリンクにタイムスタンプと検証コードを追加して、サーバーファイルが勝手にダウンロードされて盗まれるのを防ぐことができます。

タイミング図

Nginx の設定

ここでは、Nginx のインストール方法については詳しく説明しません。インストール中に ngx_http_secure_link_module を有効にすることを忘れないでください。

./configure --with-http_secure_link_module #nginx をコンパイルするときに追加

インストール完了検出:

nginx -V

次のように表示されたら、構成は成功です。

設定引数: --with-http_secure_link_module --prefix=/usr/local/nginx --with-http_stub_status_module

インスタンス構成

サーバー{
   聞く 80;
   サーバー名 download.52itstyle.com;
   文字セット utf-8;
   位置 / {
     #ここでは2つのパラメータが設定されています。1つはmd5、もう1つはexpiresです。
     secure_link $arg_md5、$arg_expires;
     #md5 のハッシュ形式は secret+url+expires です。expires はタイムスタンプの単位 s、url はリクエスト アドレス secure_link_md5 52itstyle$uri$arg_e;
     #ここでの md5 は secure_link_md5 メソッドを使用して計算したハッシュです。 secure_link は計算したハッシュ値を比較して、md5 パラメータと一致するかどうかを確認します if ($secure_link = "") {
       #リソースが存在しないかハッシュ比較に失敗した場合は、402 を返します。
     }
     $secure_link = "0"の場合{
       #タイムアウトに失敗し、405 を返します。
     }
     #ファイル名を変更します。add_header Content-Disposition "attachment;filename=$arg_f";
     エイリアス /data/site/down.52itstyle.com/;
   }
   エラーページ 500 502 503 504 /50x.html;
   エラーページ 402 405 /40x.html;
   場所 = /50x.html {
     ルートhtml;
   }
   場所 = /40x.html {
     ルートhtml;
   }
}

パラメータ

セキュアリンク

構文: secure_link 式;

デフォルト値: なし

構成セクション: http、サーバー、場所

式はチェックサムと有効期限で構成されます。チェックサムは secure_link_md5 で指定されたパラメータの MD5 ハッシュ値と比較されます。

2 つの値が矛盾する場合、$secure_link 変数の値は空になります。2 つの値が一致する場合は、有効期限チェックが実行されます。有効期限が切れている場合は、$secure_link 変数の値は 0 になります。有効期限が切れていない場合は、1 になります。

リンクが時間に敏感な場合、有効期限は、MD5 ハッシュ値の後にコンマで区切られたタイムスタンプを使用して設定されます。有効期限が設定されていない場合、リンクは永久に有効になります。

セキュアリンクmd5

構文: secure_link_md5 式;

デフォルト値: なし

構成セクション: http、サーバー、場所

式は、URL で渡された md5 値と比較および検証される md5 ハッシュ値を計算するためのパラメータを指定します。式には通常、URI (例: demo.com/s/link の URI は /s/link) と暗号化キー シークレットが含まれます。リンクに時間制限がある場合は、式に $secure_link_expires を含める必要があります。式には、アクセス IP、ブラウザのバージョン情報などのクライアント情報も含めることができます。

Javaバックエンド構成

ケース(参考のみ):

org.apache.commons.codec.binary.Base64 をインポートします。
org.apache.commons.codec.digest.DigestUtils をインポートします。
/**
 * 暗号化された接続を生成する */
パブリッククラスSecureLink {
  プライベート静的文字列サイト = "https://down.52itstyle.com/";
  プライベート静的文字列シークレット = "52itstyle";
  パブリック静的文字列createLink(文字列パス、文字列ファイル名){
    String time = String.valueOf((System.currentTimeMillis() / 1000) + 300); // 5分間有効 String md5 = Base64.encodeBase64URLSafeString(DigestUtils.md5(secret + path + time));
    文字列 url = サイト + パス + "?md5=" + md5 + "&expires=" + 時間 + "&f="+fileName;
    URLを返します。
  }
  パブリック静的voidメイン(String[] args) {
    //https://down.52itstyle.com/2018101025689452.pdf?md5=FnDYyFzCooI9q8sh1Ffkxg&expires=1539847995&f=分散 seckill アーキテクチャ.pdf
    System.out.println(createLink("2018101025689452.pdf","分散 seckill アーキテクチャ.pdf"));
  }
}

要約する

暗号化プロセス全体は対称暗号化に少し似ています。バックエンドはキーに基づいて暗号化されたアドレスを生成し、Nginx プロキシ サーバーは復号化検証を実行します。検証に合格すると、ダウンロードが許可されます。

テスト中に別の問題が見つかりました。生成されたリンクがタイムアウトすることがあります。これは、バックエンド サーバーとダウンロード サーバー間の時間の不一致が原因である可能性があります。システム時間を同期できます。

ポイントダウンロードサービスを提供している友人がいる場合、これは確かに良い選択です。注意する必要があるのは、漏洩を防ぐためにキーを定期的に変更する必要があることです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • nginx アンチホットリンクおよびアンチクローラー設定の詳細な説明
  • 画像アンチホットリンククラッキング操作例のPHP実装【画像アンチホットリンク問題解決/リバースプロキシ】
  • Nginx でアンチホットリンクを設定するための手順を完了する
  • Nginx のクロスドメイン アクセス シナリオの構成とアンチホットリンクの詳細
  • Nginx のアンチホットリンクを設定する方法
  • SpringBootはFastDFS+Nginxを統合し、トークンベースのアンチホットリンク方式を統合します
  • WeChat画像ホットリンク保護の解決策の詳細な説明「この画像はWeChatパブリックプラットフォームからのものであり、許可なく引用することはできません」
  • .htaccess を使用して画像のホットリンク保護を設定する詳細な方法
  • WeChat記事画像のホットリンク保護問題に対する簡単な解決策
  • PHPでWeChat記事画像のホットリンク保護を解決する方法

<<:  mysqldump でデータベースをバックアップするときに特定のライブラリを除外する例

>>:  スキニングを実現するネイティブJavaScript

推薦する

前後の秒、分、時間、日数を取得するMySQLデータベース

現在の時刻を取得します: current_timestamp を選択します。出力: 2016-06-...

Linux と最もよく使用されるコマンドの紹介 (習得は簡単ですが、問題の 95% 以上を解決できます)

Linux は現在最も広く使用されているサーバー オペレーティング システムです。Unix をベー...

Linux に nginx をインストールする方法

Nginx は C 言語で開発されており、Linux で実行することをお勧めします。もちろん、Win...

js を使用して数字推測ゲームを実装する

先週、先生が私に数字当てゲームをするちょっとした宿題を出しました。とても面白いと思ったので、適当に書...

MySQL InnoDB テーブルスペース暗号化の例の詳細な説明

序文MySQL 5.7.11 以降、MySQL は、別の表領域に格納された InnoDB テーブルの...

Vue モバイル プロジェクトでページ キャッシュを実装する方法のサンプル コード

背景モバイル デバイスでは、ページ ジャンプ間のキャッシュが必須要件です。例: ホームページ =&g...

IE6 での PNG アルファ透明度 (完全コレクション)

IE6 は PNG の透明度をサポートしていないと多くの人が言っています。実際、IE は 100%...

Docker で Jenkins サービスを構築する例

画像をプルする root@EricZhou-MateBookProX: docker pull je...

インライン要素スパンの最小高さの定義

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

MySQL実践スキル: 2つのテーブルに異なるデータがあるかどうかを比較する方法の分析

この記事では、MySQL が 2 つのテーブルを比較して、異なるデータがあるかどうかを確認する方法を...

Linuxカーネルスケジューラソースコード初期化の分析

目次1. はじめに2. スケジューラの基本概念2.1. 実行キュー (rq) 2.2 スケジューリン...

JavaScript プロトタイプとプロトタイプチェーンの深い理解

目次1. プロトタイプとは何ですか? 2. プロトタイプ__プロト__ 4. コンストラクター5. ...

仮想スクロールを簡単に実装するためのVueサンプルコード

目次序文ローリング原理成し遂げるソースコード参照する序文モバイル Web ページの日常的な開発では、...

MySQL ユーザー変数と set ステートメントの例の詳細な説明

目次1 ユーザー変数の概要2 ユーザー変数の定義3 ユーザー変数の使用3.1 セットを通した例3.2...

MySQL公式エクスポートツールmysqlpumpの使用

目次導入説明書実際の経験長所と短所総括する導入mysqlpump は mysqldump の派生です...