Kürzlich haben wir einen Blick auf die in einer Ruby on Rails-App erlaubten Browser geworfen, heute geht es gewissermaßen um das andere Ende: Nicht, wer sich mit der App verbinden darf, sondern womit sich die App verbinden darf, oder besser gesagt, woher die App zusätzliche Inhalte wie Bilder, JavaScript, CSS, Fonts, Web Workers usw. laden darf und woher nicht. Es geht um die Content Security Policy oder CSP.

Die CSP ist ein HTTP-Header, dessen Wert verschiedene Direktiven enthält. Diese Direktiven legen (unter anderem) fest, woher eben zusätzliche Inhalte geladen werden dürfen:

Content-Security-Policy: default-src 'self'; img-src 'self' cdn.example.com;

Mit dieser Richtlinie darf die Website generell nur von der eigenen Domain laden (default-src 'self'), Bilder speziell dürfen von der Domain selbst oder von cdn.example.com geladen werden (`img-src ‘self’ cdn.example.com’). Das ist nur eine sehr einfache CSP, in der Praxis wird die Richtlinie meist deutlich komplizierter werden.

In einer Ruby on Rails-App kann man die CSP recht komfortabel festlegen, nämlich über die Einstellungen (config.content_security_policy). Neu erzeugte Apps (außer es handelt sich um reine APIs) bringen automatisch die Datei config/initializers/content_security_policy.rb. Darin findet man, zunächst auskommentiert, ein Beispiel. Die Ruby on Rails Guides zeigen ein repräsentatives Beispiel:

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

Das ist schon deutlicher übersichtlicher als die Policy in einem langen String zu verwalten.

Wer neben der CSP noch weitere Security Header wie etwa HSTS, X-Frame-Options oder das (nicht unproblematische) X-XSS-Protection kontrollieren will, kann übrigens auf das Gem secure_headers zurückgreifen.