🐷

Nginxで防盗リンク(直リンク防止)を設定する方法

に公開

防盗链(直リンク防止)技術は、許可されていないウェブサイトが他のサイト上のリソース(画像など)を直接リンクするのを防ぐために使われます。この技術は、さまざまな方法でリクエストの正当性を検証し、特定のリソースにアクセスできるのは認可されたユーザーやサイトだけになるようにします。

実現方法

Nginxにおける防盗链の設定は主に、HTTPリクエスト内のRefererヘッダーを検証することで実現します。Refererヘッダーが特定の条件を満たさない場合、Nginxはリクエストを拒否できます。

valid_referersディレクティブを使うことで、どのRefererを有効とするかを定義します。

noneと指定すれば、Refererがないすべてのリクエストを拒否できますし、blockedを指定すれば、Refererがブロックされているすべてのリクエストも拒否できます。

また、if文やreturnディレクティブを組み合わせて、$invalid_referer変数をチェックできます。この変数がtrueの場合、HTTPの403禁止ステータスコードを返します。

設定ファイル

Nginxの設定ファイルは通常下記の場所にあります:

/etc/nginx/nginx.conf

または、特定のサイト用の設定ファイル、たとえば:

/etc/nginx/sites-available/default

設定例

以下はシンプルな設定例です:

server {
  listen 80;
  server_name tempmail100.com;
  location ~ .*\.(jpg|jpeg|gif|png|js|css)$ {
    valid_referers none blocked tempmail100.com www.tempmail100.com;
    if ($invalid_referer != ok) {
      return 403;
    }
    root /var/www/html;
    index index.html index.htm;
  }
}

この設定では、location行がリクエストURIをマッチさせ、jpg、jpeg、gif、png、js、cssで終わるリクエストすべてが対象になります。

valid_referers none blocked tempmail100.com www.tempmail100.com; 

の行は、許可するRefererを定義しています。noneはRefererなしを、blockedはブロックされたRefererを拒否、続くのは許可するドメインです。

if ($invalid_referer != ok) { 
    return 403; 
}

の部分で、Refererが上記に当てはまらない場合、403エラーを返します。

注意事項

この方法は完全な安全策ではありません。なぜなら、Refererヘッダーは偽造可能だからです。

より安全にしたい場合は、IPアドレスベースやユーザー認証、その他より複雑なセキュリティ対策と組み合わせることをおすすめします。

もしNginxの具体的な設定で不明な点や追加の質問があれば、ご遠慮なくどうぞ。

Discussion