CSP
Content Security Policy — builder, directives.
● ● ●
RuniqueApp::builder(config)
.middleware(|m| {
m.with_csp(|c| {
c.policy(SecurityPolicy::strict())
.with_header_security(true) // X-Frame-Options, X-Content-Type, etc.
.with_upgrade_insecure(!is_debug()) // HTTP → HTTPS in prod
.images(vec!["''self''", "data:"]) // Allow data: for images
})
})
// Strict: blocks everything not explicitly allowed
SecurityPolicy::strict()
// Permissive: for dev / migration phases
SecurityPolicy::permissive()
// Generated header (strict):
// Content-Security-Policy:
// default-src ''self'';
// script-src ''self'' ''nonce-abc123'';
// style-src ''self'';
// img-src ''self'' data:;
// object-src ''none'';
// frame-ancestors ''none'';
// 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>