Content Security Policy(コンテンツセキュリティーポリシー)

コンテンツセキュリティーポリシー、略してCSP。

Webサイトやアプリなどのコンテンツを保護するためのセキュリティの仕組み。

クロスサイトスクリプティングやデータインジェクション攻撃を検知し、影響を軽減できる。

CSPを有効にするにはサーバーが送信するHTTPレスポンスヘッダーに Content-Security-Policy: policy と設定すればOK

RailsのCSPの設定方法

RailsではCSPを設定するためのDSLが提供されている

コードは Rails セキュリティガイド - Railsガイド からの引用。

# config/initializers/content_security_policy.rb
Rails.application.config.content_security_policy do |policy|
  policy.default_src :self, :https
  policy.font_src    :self, :https, :data
  policy.img_src     :self, :https, :data
  policy.object_src  :none
  policy.script_src  :self, :https
  policy.style_src   :self, :https

  # 違反レポートの送信先URIを指定する
  policy.report_uri "/csp-violation-report-endpoint"
end

コントローラーでオーバーライドするコード例

# ポリシーをインラインでオーバーライドする場合
class PostsController < ApplicationController
  content_security_policy do |policy|
    policy.upgrade_insecure_requests true
  end
end

# リテラル値を使う場合
class PostsController < ApplicationController
  content_security_policy do |policy|
    policy.base_uri "https://www.example.com"
  end
end

# 静的値と動的値を両方使う場合
class PostsController < ApplicationController
  content_security_policy do |policy|
    policy.base_uri :self, -> { "https://#{current_user.domain}.example.com" }
  end
end

# グローバルCSPをオフにする場合
class LegacyPagesController < ApplicationController
  content_security_policy false, only: :index
end

また、 Content-Security-Policy ヘッダーの代わりに Content-Security-Policy-Report-Only ヘッダーを指定するとポリシーは適用せずに違反内容だけをレポートできる。

# config/initializers/content_security_policy.rb
Rails.application.config.content_security_policy_report_only = true