Nginx で画像の直リンク対策を考える
コンサルしているサイトさんで、画像の直リンク対策を実装してみました。
運営方針によって実装方法は変わりますので、ホワイトリスト方式
とブラックリスト方式
で対策できるようにしてみました。
画像の直リンク問題と対策
画像の直リンクとは
直リンク(じかリンク、ちょくリンク)とは、インターネットのWWWで公開されている画像などのメディアファイルのURLを参照し、インラインで表示する形態で別のウェブサイトにあるウェブページに貼り付けたり、リンクを張ったりする事。直リンとも。トップページ以外のサイト記事のURLに対してリンクを張ることについてはディープリンクを参照。
画像の直リンクを防ぎたい理由
スクレイピングサイト*1や画像の直リンクを行っているブログパーツに自サイトが掲載されてしまいました。
テキストは相手サーバーに存在するのでこちらの負荷にはなりませんが、画像の直リンクは、先方のサイトから読み込まれるたびにこちらのサーバーの負荷になります。
その結果、自サイトのアクセスは増えていないにも関わらず負荷だけが増えていきました。
ホワイトリスト方式
設定方法
/etc/nginx/blacklist.conf
にブラックリストを記載
# /etc/nginx/blacklist.conf map $http_referer $bad_referer { hostnames; default 0; # ブラックリスト一覧を記載 "~social-buttons.com" 1; }
/etc/nginx/nginx.conf
からブラックリストを読み込み
# /etc/nginx/nginx.conf http { # ... include blacklist.conf; # ... }
/etc/nginx/sites-enabled/mysite.conf
を編集して、サイトごとの設定ファイルにブラックリストの分岐を追加
# /etc/nginx/sites-enabled/mysite.conf server { # ... location ~* \.(jpg|jpeg|gif|png|ico)$ { if ($bad_referer) { return 403; } } # ... }
アクセス拒否できているか確認
$ curl --referer http://social-buttons.com http://hoge.com/test.jpg
ブラックリスト方式
設定方法
location ~* \.(jpg|jpeg|gif|png|ico)$ { valid_referers none server_names blocked *.google.co.jp *.yahoo.co.jp; if ($invalid_referer) { return 403; } }
自サイト、リファラーなし、google.co.jp、yahoo.co.jpを許可。
ここでは、例として以上のリファラーを許可し、それ以外は403 forbidden (閲覧禁止)を返却するという設定をしています。
一歩先の方法はないものか
実装しながら思ったことがあります。
もしかしたら、直リンクしてるサイト側にも悪意がまったくないのかもしれません。
ユーザー投稿型のサイトだったら、勝手にユーザーが直リンクを掲載してる可能性だってあります。
つまり、単に直リンクされたから禁止、とするのは最善の手段ではないと言えます。
直リンクされているサイトの運営者に一度連絡を取ってみて、双方で話し合って改善策を出したほうがいいこともあるでしょう。
そこから思いもよらぬ関係性が構築できて、メディアの成長につながるかもしれません。
繰り返します。
禁止するだけが、最善の手段ではありません。