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 トランザクション分離レベルとロックメカニズムの問題に関する深い理解

概要データベースは通常、複数のトランザクションを同時に実行します。複数のトランザクションが、同じデー...

MySql で SQL 実行プランをクエリするために explain を使用する方法

explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方法で...

Linux の運用と保守で netstat の代わりに ss コマンドを使用する方法

序文Linux サーバーを操作および管理するときに、最もよく使用されるコマンドの 1 つが nets...

Linux ドメイン ネーム サービス DNS 設定方法

DNSとはDNS の正式名称は Domain Name System で、ドメイン名解決システムを意...

CSSプロパティに基づいたボタンホバーボーダーと背景アニメーションのコレクション

ハートの属性不透明度: .999 は要素のスタッキングコンテキストを作成し、ボタン6と8のアニメーシ...

入力が完了したことを検出し、次のコンテンツを自動的に入力する HTML を実装する方法

前回の記事では、入力完了の簡単な検出を実現しましたが、今回はさらに一歩進んで、入力が完了した後に次の...

Webページ作成の質問: 画像ファイルのパス

この記事は 123WORDPRESS.COM Lightning によるオリジナルです。転載する際に...

v-model 双方向バインディングデータを実装する vue カスタム コンポーネントのサンプル コード

プロジェクトでは、プロジェクトが呼び出すカスタム パブリック コンポーネントに遭遇します。通常、pr...

シンプルなショッピングフォームを実装するJavaScript

この記事では、簡単なショッピングフォームを実装するためのJavaScriptの具体的なコードを参考ま...

ブロックレベル要素、インライン要素、可変要素の概要

ブロック要素p - 段落テキストの事前フォーマットテーブルol - ソートフォームul - 順序なし...

Reactイベントバインディングの詳細な説明

1. 何ですかreactアプリケーションでは、イベント名はキャメルケース形式で記述されます。たとえ...

過去の Linux イメージの問題を修正するためのサンプル分析

過去の Linux イメージに関する問題を修正従来の Linux イメージで作成された ECS クラ...

WINDOWS での MYSQL のインストールに関する詳細なチュートリアル

1. インストールパッケージをダウンロードする- お使いのコンピュータシステムに応じて適切なバージョ...

テーブルタグ(テーブル)詳細

<br />テーブルは、昔から誰もが使ってきたタグで、今も使われています。しかし、現在の...

フローティングメニューを実装するjQueryプラグイン

毎日jQueryプラグインを学ぶ - フローティングメニュー、参考までに、具体的な内容は次のとおりで...