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移行計画と落とし穴の実践記録

目次背景解決策1: 古いデータをバックアップするオプション2: テーブルを分割する解決策3: tid...

Hyper-V インストール CentOS 8 の問題の分析

CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...

テキストの円形スクロールアニメーションを実装するミニプログラム

この記事では、参考までに、テキストループスクロールを実現するアプレットの具体的なコードを例を挙げて紹...

トランジションコンポーネントのアニメーション効果を使用した Vue サンプルコード

トランジションドキュメントアドレスは、フェードインとフェードアウト効果を実現するための背景ポップアッ...

純粋なCSSで立体的な画像配置効果を実現するサンプルコード

1. 要素の幅/高さ/パディング/マージンのパーセンテージ基準要素の幅/高さ/パディング/マージンの...

DOCTYPE宣言の機能と使い方の詳しい説明

1. ブラウザのレンダリングモードとdoctype一部の Web ページは標準に従って作成されていま...

クロスオリジン画像リソース権限(CORS 対応画像)

HTML 仕様書では、画像の crossorigin 属性が導入されています。適切なヘッダー情報 ...

HTML の表のフレームとルール属性の詳細な説明

テーブル タグの frame 属性と rules 属性は境界線の表示を制御できます。フレーム プロパ...

MySQL をベースにしたシンプルな検索エンジンを実装する

目次MySQL ベースの検索エンジンの実装1. ngram全文パーサー2. 全文インデックスを作成す...

小さな三角形の実装コードを含む CSS ナビゲーション バー メニュー

多くの Web ページにはナビゲーション バーに小さな三角形があり、この機能を実装するのは実は非常に...

VMware ワークステーション 12 に Ubuntu 14.04 (64 ビット) をインストール

1. インストール環境コンピュータモデル: Lenovo Y471a (i5) ノートパソコンシステ...

HTMLのタグと要素の違いの詳細な説明

ウェブページに慣れていない友人の多くは私と同じように、HTML で要素、タグ、属性がどのように定義さ...

高同時実行シナリオにおける nginx 最適化の詳細な説明

日常の運用・保守作業では、nginx サービスが頻繁に使用され、nginx の高同時実行性によって生...

html2canvas を使用して HTML コードを画像に変換する方法

コードを画像に変換するにはhtml2canvas は、ブラウザから Web ページのスクリーンショッ...

組み込み Linux 開発環境で ping と nfs を構築するためのソリューション

1. 組み込みソフトウェアレベル 1) ブートローダ -> ブートローダ組み込みシステム全体の...