A Rails engine that collects, stores and notifies on Slack about Content Security Policy (CSP) violation reports.
- Public
/csp-reportsendpoint for browsers to POST CSP violations - Stores CSP reports in a database table
- Tracks notification status with
notified_atcolumn - Optional Slack notifications for CSP violations
- Easy integration with Rails applications
- Ruby >= 3.2
- Rails >= 7.1
- PostgreSQL (for JSONB support)
Add this line to your application's Gemfile:
gem'reported'And then execute:
$ bundle installOr install it yourself as:
$ gem install reported- Run the install generator:
$ rails generate reported:installThis will create an initializer at config/initializers/reported.rb.
- Run the migrations:
$ rails reported:install:migrations
$ rails db:migrateThis creates the reported_reports table.
The CSP reports endpoint is automatically available at /csp-reports (no mounting required).
Configure your application's CSP to send reports to the endpoint. In config/initializers/content_security_policy.rb:
Rails.application.config.content_security_policydo |policy|
policy.default_src:self,:httpspolicy.script_src:self,:https# ... your other CSP directives ...# Configure the report URIpolicy.report_uri"/csp-reports"endTo enable Slack notifications, configure the initializer at config/initializers/reported.rb:
Reported.configurationdo |config|
# Enable or disable Slack notificationsconfig.enabled=true# Slack webhook URL for notificationsconfig.slack_webhook_url=ENV['REPORTED_SLACK_WEBHOOK_URL']endGet your Slack webhook URL from Slack API.
Set the webhook URL as an environment variable:
REPORTED_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URLOnce configured, the gem automatically:
- Receives CSP violation reports at
/reported/csp-reports - Stores them in the
reported_reportstable - Sends notifications to Slack (if enabled)
- Marks reports as notified with the
notified_attimestamp
You can access reports through the Reported::Report model:
# Get all reportsReported::Report.all# Get unnotified reportsReported::Report.not_notified# Get notified reportsReported::Report.notified# Mark a report as notified manuallyreport=Reported::Report.firstreport.mark_as_notified!The reported_reports table includes:
document_uri- The URI of the document where the violation occurredviolated_directive- The CSP directive that was violatedblocked_uri- The URI that was blockedoriginal_policy- The complete CSP policyraw_report- The complete JSON report from the browsernotified_at- Timestamp of when the report was sent to Slackcreated_at/updated_at- Standard timestamps
The gem is available as open source under the terms of the MIT License.