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 データベースの復旧どの企業にとっても、データは最も価値の...

HTML ウェブページにおけるさまざまなフォント形式の詳細

このセクションでは、テキストの変更の詳細から始めます。これにより、読者はさまざまな HTML フォン...

MySQL の general_log ログの知識ポイントの紹介

以下の操作デモンストレーションはすべて MySQL バージョン 5.6.36 に基づいています。仕事...

Ubuntu 18.04 に opencv 3.2.0 をインストールするためのソリューション

opencv.zip をダウンロード依存関係を事前にインストールします。まずダウンロードソースを更新...

Vue は Tencent TIM インスタント メッセージングを統合します

この記事では主に、Tencent TIM インスタント メッセージングを Vue と統合する方法を紹...

フローチャートとUIフローの違い

UI デザインにおける多くの概念は言葉で言えば似ているように見えるかもしれませんが、実際には大きく異...

情報製品の読書リストのインタラクティブなデザインに関する考えと経験の共有

リストは、テーブルをコンテナーとして使用するテキストまたはグラフの形式として定義されます。商品の種類...

React Routerの歴史について簡単に説明します

React Router を理解したいなら、まず歴史を理解する必要があります。より具体的には、Rea...

Linux システムで TCP 接続を作成するプロセスの紹介

目次LinuxでTCPを作成する手順サーバクライアントTCP確立プロセスサンプルコードLinuxでT...

Windows ベースの MySQL 8.0.12 のインストール

このチュートリアルは Windows システムにのみ適用されます。インストールしたがまだインストール...

WeChatアプレットのスワイパードットのドットをスライダーに変更する方法

目次背景ターゲット効果アイデア成し遂げるスワイパーは変更を聞きますカスタムドットモジュール変更イベン...

CSS スタイルの優先順位とカスケード順序に関する議論

一般的に: [重要なフラグ1つ] > [特別なフラグ4つ] > 宣言順!importan...

PostgreSQL正規表現の一般的な機能の概要

PostgreSQL正規表現の一般的な機能の概要正規表現は、複雑なデータ処理を必要とするプログラムに...

js は丸で囲まれた数字のリストのサンプルコードを動的に追加します

1. まず本文にulタグを追加します <!-- 順序なしリスト --> <ul i...

CSS3 border-radius 丸角の実装方法と使い方の詳しい説明

以前は、角を丸くするのは非常に面倒でしたが、CSS3 では、角を丸くするのは非常に簡単になり、bor...