Rack::Protection を Rails 3.2.X から使う

脆弱性対策を自分で考えるのは限界があるので、仕組みについてはきちんと知った上でライブラリのお世話になりましょう。これ自体は Rack を用いたアプリケーションであれば何でも使えるのですが、今回は Rails で使う場合のお話をします。

導入手順

まずアプリケーションルートに移動し Gemfile を編集します。

gem 'rack-protection'

追加する位置はすべての環境から読めるところにしておきましょう。終わったらいつものように bundle install します。

次に config.ru を開き run Application の前に一行追加します。

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
use Rack::Protection
run SampleApp::Application

特定の機能だけ使いたい場合は、それだけ指定します(Rails の場合はデフォルトで対策してくれている箇所も多いので、こちらの使い方がメインになるかと思います)。

use Rack::Protection::FrameOptions

その他、詳しい使い方は github を参照してください。

https://github.com/rkh/rack-protection

追記

ここまで書いてレスポンスヘッダを確認しても X-FRAME-OPTIONS: DENY が返されなかったので何かうまくいっていない可能性があります。Unicorn との食い合わせあたりかもしれないのですが、さらに調べてみます。

追記の追記

application_controller でレスポンスヘッダを指定するときちんと出力されるので、やはりどこかで失敗している気がします。

# coding: utf-8
class ApplicationController < ActionController::Base
  # 略
  after_filter :set_default_headers

  private
  def set_default_headers
    response.headers['X-Frame-Options'] = 'DENY'
  end
end

ドキュメントを読む限り Rails では将来的に config.action_dispatch.default_headers でこの手の値をセットできるようになるらしいので、そちらで対処した方がいいという事でしょうか。うーむ?