【Rails】CSPの設定をした

CSPのJSの実行の制限について調査して設定する。

デフォルトではCSPはコメントアウトされている。JSに関するポリシーを有効化する。そうするとJSを使っているテストが落ちるようになるので、report_onlyをtrueにして詳しいエラーメッセージを確認する。

Rails.application.configure do
  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
    # Specify URI for violation reports
    # policy.report_uri "/csp-violation-report-endpoint"
  end

  config.content_security_policy_report_only = true
end

サーバーを立ち上げてページにアクセスすると以下のようなエラーが。

[Report Only] Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' https:".

‘unsafe-eval’で調べると、これを指定しない場合に以下のようなJSを弾く設定になるとのこと。

eval()
Function()
setTimeout()
setInterval()
...

参考: CSP: script-src - HTTP | MDN

実際のコンソールではこれだけのエラーが出ている。

https://s3.us-west-2.amazonaws.com/secure.notion-static.com/cc600d0c-eef9-4b59-9fa6-38b5af532649/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220412%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220412T052925Z&X-Amz-Expires=86400&X-Amz-Signature=ca6c8b5c54cec66ca2883458a9616f31f03c33862f0e7ac132aa4b9f7ccd43b1&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject

リンクを辿ると、application-なんたら.jsの中で、evalメソッドが大量に使われているので、これが引っかかっているようだ。これは、webpackで生成されたスクリプトで絶対に出てきそうなコードなので、設定する必要がありそう。

なので、‘unsafe-eval’を指定。

policy.script_src  :self, :unsafe_eval, :https

参考: Rails アプリケーションのセキュリティ対策(CORS/CSP/HSTS)

これでエラーが出なくなり、テストも通るようになった。

ちなみにHTTPのレスポンスヘッダーが以下のように指定されている。

Content-Security-Policy: script-src 'self' 'unsafe-eval' https: