CSP

Content Security Policy — builder, directives.

● ● ●
RuniqueApp::builder(config)
    .middleware(|m| {
        m.with_csp(|c| {
            c.policy(SecurityPolicy::strict())
             .with_upgrade_insecure(!is_debug())  // CSP directive upgrade-insecure-requests
             .images(vec!["'self'", "data:"])    // Allow data: for images
        })
    })

// X-Frame-Options, X-Content-Type-Options, Referrer-Policy... are always sent.
// Strict: no 'unsafe-inline', upgrade-insecure-requests on
SecurityPolicy::strict()

// Permissive: for local development only
SecurityPolicy::permissive()

// Generated header (strict):
// Content-Security-Policy:
//   default-src 'none';
//   script-src 'self' 'nonce-abc123';
//   style-src 'self';
//   img-src 'self';
//   font-src 'self';
//   connect-src 'self';
//   object-src 'none';
//   frame-ancestors 'none';
//   base-uri 'self';
//   form-action 'self';
//   upgrade-insecure-requests
{# The nonce is regenerated on every request.
   It is automatically injected into the CSP header. #}
<script nonce="{{ csp_nonce }}">
    // This inline script is allowed by CSP
    document.querySelector('form').addEventListener('submit', ...);
</script>