78 lines
2.6 KiB
Ruby
78 lines
2.6 KiB
Ruby
# Be sure to restart your server when you modify this file.
|
|
|
|
# Define an application-wide content security policy.
|
|
# See the Securing Rails Applications Guide for more information:
|
|
# https://guides.rubyonrails.org/security.html#content-security-policy-header
|
|
|
|
Rails.application.configure do
|
|
config.content_security_policy do |policy|
|
|
# Default policy: only allow resources from same origin and HTTPS
|
|
policy.default_src :self, :https
|
|
|
|
# Scripts: strict security with nonce support for dynamic content
|
|
policy.script_src :self, :https, :strict_dynamic
|
|
|
|
# Styles: allow inline styles for CSS frameworks, but require HTTPS
|
|
policy.style_src :self, :https, :unsafe_inline
|
|
|
|
# Images: allow data URIs for inline images and HTTPS sources
|
|
policy.img_src :self, :https, :data
|
|
|
|
# Fonts: allow self-hosted and HTTPS fonts, plus data URIs
|
|
policy.font_src :self, :https, :data
|
|
|
|
# Media: allow self and HTTPS media sources
|
|
policy.media_src :self, :https
|
|
|
|
# Objects: block potentially dangerous plugins
|
|
policy.object_src :none
|
|
|
|
# Base URI: restrict base tag to same origin
|
|
policy.base_uri :self
|
|
|
|
# Form actions: only allow forms to submit to same origin
|
|
policy.form_action :self
|
|
|
|
# Frame ancestors: prevent clickjacking by disallowing framing
|
|
policy.frame_ancestors :none
|
|
|
|
# Frame sources: block iframes unless explicitly needed
|
|
policy.frame_src :none
|
|
|
|
# Connect sources: control where XHR/Fetch can connect
|
|
policy.connect_src :self, :https
|
|
|
|
# Manifest: only allow same-origin manifest files
|
|
policy.manifest_src :self
|
|
|
|
# Worker sources: control web worker origins
|
|
policy.worker_src :self, :https
|
|
|
|
# Report URI: send violation reports to our monitoring endpoint
|
|
if Rails.env.production?
|
|
policy.report_uri "/api/csp-violation-report"
|
|
end
|
|
end
|
|
|
|
# Generate session nonces for permitted inline scripts and styles
|
|
config.content_security_policy_nonce_generator = ->(request) {
|
|
# Use a secure random nonce instead of session ID for better security
|
|
SecureRandom.base64(16)
|
|
}
|
|
|
|
# Apply nonces to script and style directives
|
|
config.content_security_policy_nonce_directives = %w(script-src style-src)
|
|
|
|
# Automatically add `nonce` attributes to script/style tags
|
|
config.content_security_policy_nonce_auto = true
|
|
|
|
# Enforce CSP in production, but use report-only in development for debugging
|
|
if Rails.env.production?
|
|
# Enforce the policy in production
|
|
config.content_security_policy_report_only = false
|
|
else
|
|
# Report violations only in development (helps with debugging)
|
|
config.content_security_policy_report_only = true
|
|
end
|
|
end
|