nginx の valid_refererで直リンクを防止する

公開:2015-01-07 05:46
更新:2020-02-15 04:37
カテゴリ:nginx,youtube,youtube viewer

おとといと昨日はnginxをいじっていた。Youtube Data APIは一般公開しているものに関してはOauth認証なしにアクセスでき、動画・プレイリストや各種情報を取得できる。私が欲しいのは「私の公開情報」なのでこれで十分である。ただAPIを呼び出すにはAPIキーをGoogle Developers Consoleで取得する必要がある。取得自体はGoogleアカウントがあれば誰でも取得できる。ただこのAPI Keyをなるべく人目に触れないようにすることが望ましい。ローカルでバッチ処理するのであれば人目にさらすことはないと思うけど、ブラウザで動かす場合はそうはいかない。完全にはないにしてもなんらかの対策を施す必要がある。何も設定しないでいるとJavaScriptソース上のAPI Keyが見えてしまうし、API Key自体を別ファイルにしたとしてもそのファイルのURLをブラウザで直接叩けばAPI Keyは丸見えである。

なるたけ見えないようにするには

  1. API Key部分を別ファイルとしてサーバーに置く。
  2. API Keyファイルにアクセスがあった場合refererをチェックして、自サーバーやgist、その他許可したサーバーからのアクセス以外は403を返す。

くらいかなと思う。でこれを実げするにはWebサーバー側の設定を変更する必要がある。私はnginxを使っているので、これを実現するためにvalid_referersを使う。使い方は

ngx_http_referer_module モジュール 日本語訳

を見ればだいたいわかった。valid_referersでググれば大量に出てくるのでそれをもとに下記のようなディレクティブを作成した。scriptsディレクトリにAPI Keyが入っているのでそこを丸ごと対象にしている。

       location ~ /scripts/  {
        valid_referers server_names ~.enoie.net ~.*.github. ~.google. ~.yahoo. ~.bing. ~.facebook. ~.fbcdn.;
        if ($invalid_referer) { return 403;}
    }

最初はnoneとserver_namesを併記していたのだけれども、なぜかうまくいかなかった。サンプル等では併記できているのだが不思議だ。