Security

Production-grade defaults built in. Harden your app using examples/todo as the reference implementation.

Built in (no setup)

  • CSRFX-Resuma-CSRF on actions and submits
  • Headers — CSP nonces, HSTS, X-Frame-Options, COOP, CORP
  • Rate limiting — per-IP on /_resuma/action/*
  • Origin check — blocks cross-origin POST abuse
  • SSR safety — escaped HTML + sanitized JSON state + JSON-LD
  • Client bundlesscript-src 'self'; TypeScript via ClientComponent

Trust boundaries

APIEscapingNotes
view! text/attrsAutoDefault for UI
View::raw()NoneTrusted static HTML only
with_head()PartialInline <style> / <script> get CSP nonces; external src scripts use 'self'
ClientComponentAttrs escapedIds restricted to [a-zA-Z0-9_-]
Resumability payloadSanitizedBlocks </script> breakouts

Rate limiting

Per-IP sliding window in memory (resets on process restart). Defaults: 120 action RPC/min, 60 submits/min. Tune with RESUMA_RATE_ACTIONS / RESUMA_RATE_SUBMITS. For multi-instance deployments, add edge rate limiting (Fly, Cloudflare, nginx) in front of Resuma.

Guides

Quick start (ResumaApp)

mod security;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    security::install();
    ResumaApp::new()
        .page("/", || Home::render(HomeProps::default()))
        .serve(security::serve_options())
        .await
}