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

推薦する

Docker Swarm を使用して分散クローラー クラスターを構築する例

クローラーの開発プロセス中に、クローラーを複数のサーバーに展開する必要がある状況に遭遇したことがある...

Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました

MySQLへの接続ここでは、リモート接続に navicat を使用します。MySQL に接続する前に...

IE6 で PNG-24 形式の画像を正常に表示させる 2 つの方法

方法1: </html>の後に次のコードを追加してください。コードをコピーコードは次のと...

CSS のサイズと幅と高さのブラウザ解釈の違いに対する解決策

まずは例を見てみましょうコードをコピーコードは次のとおりです。 <!DOCTYPE html ...

CentOS 8 カスタム ディレクトリ インストール nginx (チュートリアルの詳細)

1. ツールとライブラリをインストールする# PCRE は、Perl 互換の正規表現ライブラリを含...

Linux システムで Java 環境変数を設定する方法

Java環境変数を設定するここで、環境変数は etc/profile に設定され、つまり、すべてのユ...

MySQL のロードバランサーとして nginx を使用する方法

注意: nginxのバージョンは1.9以上である必要があります。nginxをコンパイルするときに、-...

Linuxの貼り付けコマンドの使い方

01. コマンドの概要貼り付けコマンドは各ファイルを列ごとに結合します。これは、2 つの異なるファイ...

Linux環境変数の設定に関する完全なガイド

Linux環境変数の設定ソフトウェアのインストールをカスタマイズする場合、多くの場合、環境変数を設定...

Facebookの情報アーキテクチャの分析

<br />原文: http://uicom.net/blog/?p=762 Faceb...

ミニプログラム録画機能の実装

序文ミニプログラムを開発する過程では、録音機能を実装し、録音を再生し、録音をサーバーにアップロードす...

MySQLのREDOログとUNDOログの詳細な説明

MySQL ログ システムで最も重要なログは、REDO ログとアーカイブ ログです。後者は MySQ...

Nginxにモジュールを動的に追加する方法

前面に書かれた多くの場合、現在のプロジェクトの状況とビジネスニーズに基づいて Nginx をインスト...

HTML ハイパーリンク タグ_Powernode Java アカデミー

HTML を学習したり使用したりしたことがある人なら、<a> タグについてよく知っている...

デザイン理論:人間中心のデザインコンセプト

<br />思想が東西に分かれていた時代、東洋の叡智を代表するものの一つとして「禅」は多...