| Crates.io | http-security-headers |
| lib.rs | http-security-headers |
| version | 0.1.0 |
| created_at | 2025-11-08 23:09:55.918471+00 |
| updated_at | 2025-11-08 23:09:55.918471+00 |
| description | Type-safe, framework-agnostic HTTP security headers with Tower middleware support |
| homepage | |
| repository | https://github.com/danielrcurtis/http-security-headers |
| max_upload_size | |
| id | 1923376 |
| size | 153,879 |
Type-safe, framework-agnostic HTTP security headers for Rust with Tower and Actix-Web integration.
thiserror; middleware feature adds Tower + pin-project-lite| Header | Description |
|---|---|
| Content-Security-Policy (CSP) | Prevents XSS and code injection attacks |
| Strict-Transport-Security (HSTS) | Forces HTTPS connections |
| X-Frame-Options | Prevents clickjacking attacks |
| X-Content-Type-Options | Prevents MIME type sniffing |
| Referrer-Policy | Controls referrer information |
| Cross-Origin-Opener-Policy (COOP) | Isolates browsing contexts |
| Cross-Origin-Embedder-Policy (COEP) | Controls cross-origin resource loading |
| Cross-Origin-Resource-Policy (CORP) | Controls resource sharing |
Add to your Cargo.toml:
[dependencies]
http-security-headers = "0.1"
# For middleware support
http-security-headers = { version = "0.1", features = ["middleware"] }
# For Actix-Web integration
http-security-headers = { version = "0.1", features = ["actix"] }
use http_security_headers::Preset;
// Use a preset configuration
let headers = Preset::Strict.build();
use http_security_headers::{SecurityHeaders, ContentSecurityPolicy};
use std::time::Duration;
let csp = ContentSecurityPolicy::new()
.default_src(vec!["'self'"])
.script_src(vec!["'self'", "'unsafe-inline'"])
.style_src(vec!["'self'", "https://fonts.googleapis.com"]);
let headers = SecurityHeaders::builder()
.content_security_policy(csp)
.strict_transport_security(Duration::from_secs(31536000), true, false)
.x_frame_options_deny()
.x_content_type_options_nosniff()
.referrer_policy_no_referrer()
.build()
.unwrap();
use axum::{Router, routing::get};
use http_security_headers::{Preset, SecurityHeadersLayer};
use std::sync::Arc;
let headers = Arc::new(Preset::Strict.build());
let app = Router::new()
.route("/", get(|| async { "Hello, World!" }))
.layer(SecurityHeadersLayer::new(headers));
use actix_web::{web, App, HttpResponse, HttpServer};
use http_security_headers::{Preset, SecurityHeadersMiddleware};
use std::sync::Arc;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let headers = Arc::new(Preset::Strict.build());
HttpServer::new(move || {
App::new()
.wrap(SecurityHeadersMiddleware::new(headers.clone()))
.route("/", web::get().to(|| async { HttpResponse::Ok().body("Hello, World!") }))
})
.bind(("127.0.0.1", 3000))?
.run()
.await
}
Recommended for applications that can enforce strict security policies.
let headers = Preset::Strict.build();
Includes:
default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'Provides good security while maintaining compatibility.
let headers = Preset::Balanced.build();
Includes:
default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none'Baseline security with minimal restrictions.
let headers = Preset::Relaxed.build();
Includes:
Check out the examples directory:
Run examples:
cargo run --example axum_basic --features middleware
cargo run --example axum_custom --features middleware
cargo run --example actix_basic --features actix
| Feature | Description |
|---|---|
middleware |
Enables Tower middleware support |
axum |
Enables Axum-specific helpers (requires middleware) |
actix |
Enables Actix-Web middleware integration (includes actix-web) |
observability |
Enables tracing support |
metrics |
Enables metrics collection |
validation |
Enables CSP/Permissions-Policy validation |
Full documentation is available on docs.rs.
| Feature | http-security-headers | secure-headers | tower-http |
|---|---|---|---|
| Type-safe configuration | ✅ | ❌ | Partial |
| Builder pattern | ✅ | ❌ | ❌ |
| Preset configurations | ✅ | ❌ | ❌ |
| Framework-agnostic | ✅ | ❌ | ✅ |
| CSP builder | ✅ | ❌ | ❌ |
| Full header support | ✅ | Partial | Partial |
Contributions are welcome! Please feel free to submit a Pull Request.
Licensed under either of:
at your option.
Inspired by: