【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
実際のコンソールではこれだけのエラーが出ている。
リンクを辿ると、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: