Cabeceras de seguridad
Corvis no trae un middleware que fije cabeceras de seguridad (al estilo del paquete helmet de Node.js). Lo que sí hace por defecto:
- Envía
X-Powered-By: corvis. Quítala conapp.disable("x-powered-by"). - Los cuerpos de respuesta llevan
Content-TypeconcharsetyContent-Length.
El resto de cabeceras se añade con un middleware global de pocas líneas.
Un middleware propio
app.use_fn registra un middleware global a partir de un closure. El closure recibe la Request y un Next; llama a next.run(req) y modifica la respuesta que devuelve:
use corvis::prelude::*;
#[corvis::main]
async fn main() -> corvis::Result<()> {
let mut app = CorvisFactory::create::<AppModule>().await?;
app.disable("x-powered-by");
app.use_fn(|req, next| async move {
let mut res = next.run(req).await?;
res.set_default_header("X-Content-Type-Options", "nosniff");
res.set_default_header("X-Frame-Options", "SAMEORIGIN");
res.set_default_header("Referrer-Policy", "no-referrer");
res.set_default_header("Cross-Origin-Opener-Policy", "same-origin");
res.set_default_header("Content-Security-Policy", "default-src 'self'");
Ok(res)
});
app.listen(3000).await
}set_default_headersolo escribe la cabecera si nadie la fijó antes de enviar la respuesta: un#[header(...)]en una ruta, un interceptor o un filtro siguen teniendo prioridad. Usaset_headersi quieres sobrescribir siempre.- Las respuestas de error de una ruta (guards, pipes, handler) llegan al middleware ya convertidas en
Responsepor los filtros, así que también reciben las cabeceras. Un404de una ruta inexistente, en cambio, llega comoErry lo convierte después el filtro global: con el?del ejemplo esa respuesta sale sin estas cabeceras. - Registra este middleware antes que
corvis::serve_static(...)si quieres que también cubra los archivos estáticos: los middleware globales se ejecutan en el orden en que se registran.
Para reutilizarlo, conviértelo en un tipo que implemente CorvisMiddleware y regístralo con app.use_middleware(...) o con consumer.apply::<M>() en un módulo. Ver Middleware.
HSTS y TLS
Strict-Transport-Security solo tiene sentido sobre HTTPS, y Corvis no termina TLS (ver HTTPS y varios servidores). Fíjala en el proxy inverso que termina TLS, o en el middleware anterior si sabes que toda la aplicación se sirve por HTTPS.