mirror of
https://github.com/Luchexx/wacrm.git
synced 2026-11-02 17:29:45 +00:00
Merge pull request #67 from ArnasDon/security/baseline-headers
security: baseline response headers (CSP report-only + OWASP set)
This commit is contained in:
commit
1707aeafb6
@ -1,5 +1,58 @@
|
|||||||
import type { NextConfig } from "next";
|
import type { NextConfig } from "next";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Baseline security headers applied to every response.
|
||||||
|
*
|
||||||
|
* CSP ships as `Content-Security-Policy-Report-Only` so the browser
|
||||||
|
* surfaces violations in the console without blocking anything — once
|
||||||
|
* we have confidence nothing legit trips it (two deploys, a pass on
|
||||||
|
* every route), flip the key to `Content-Security-Policy` to enforce.
|
||||||
|
*
|
||||||
|
* The rest of the headers are straight blocks, safe to enforce today:
|
||||||
|
* - HSTS: only meaningful on HTTPS (no-op on http://localhost).
|
||||||
|
* - X-Content-Type-Options / X-Frame-Options / Referrer-Policy:
|
||||||
|
* baseline OWASP hardening, no behavioural cost.
|
||||||
|
* - Permissions-Policy: we don't use camera / microphone / etc, so
|
||||||
|
* deny them. A supply-chain compromise or a forgotten plugin
|
||||||
|
* can't silently opt back in.
|
||||||
|
*/
|
||||||
|
const SECURITY_HEADERS = [
|
||||||
|
{
|
||||||
|
key: "Strict-Transport-Security",
|
||||||
|
value: "max-age=63072000; includeSubDomains; preload",
|
||||||
|
},
|
||||||
|
{ key: "X-Content-Type-Options", value: "nosniff" },
|
||||||
|
{ key: "X-Frame-Options", value: "DENY" },
|
||||||
|
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
|
||||||
|
{
|
||||||
|
key: "Permissions-Policy",
|
||||||
|
value: "camera=(), microphone=(), geolocation=(), payment=(), usb=()",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "Content-Security-Policy-Report-Only",
|
||||||
|
value: [
|
||||||
|
"default-src 'self'",
|
||||||
|
// Next.js needs 'unsafe-inline' for its inline hydration script
|
||||||
|
// and 'unsafe-eval' in dev + some production optimisations.
|
||||||
|
// Nonce-based CSP is a later project.
|
||||||
|
"script-src 'self' 'unsafe-inline' 'unsafe-eval'",
|
||||||
|
// Tailwind + inline style attributes on lots of components.
|
||||||
|
"style-src 'self' 'unsafe-inline'",
|
||||||
|
// Supabase public-bucket avatars, contact avatars (arbitrary
|
||||||
|
// https URLs paste-able from the UI), OG images, data URLs for
|
||||||
|
// tiny inline assets.
|
||||||
|
"img-src 'self' data: blob: https:",
|
||||||
|
"font-src 'self' data:",
|
||||||
|
// Supabase REST + realtime (WSS). All Meta API calls happen
|
||||||
|
// server-side, so graph.facebook.com does not belong here.
|
||||||
|
"connect-src 'self' https://*.supabase.co wss://*.supabase.co",
|
||||||
|
"frame-ancestors 'none'",
|
||||||
|
"base-uri 'self'",
|
||||||
|
"form-action 'self'",
|
||||||
|
].join("; "),
|
||||||
|
},
|
||||||
|
] as const;
|
||||||
|
|
||||||
const nextConfig: NextConfig = {
|
const nextConfig: NextConfig = {
|
||||||
/**
|
/**
|
||||||
* Cache-Control policy.
|
* Cache-Control policy.
|
||||||
@ -32,6 +85,11 @@ const nextConfig: NextConfig = {
|
|||||||
* from a shared cache. The s-maxage here is a ceiling; Next.js
|
* from a shared cache. The s-maxage here is a ceiling; Next.js
|
||||||
* and auth middleware still set `private` / `no-store` for
|
* and auth middleware still set `private` / `no-store` for
|
||||||
* per-user responses.
|
* per-user responses.
|
||||||
|
*
|
||||||
|
* Security headers are appended via a separate catch-all rule
|
||||||
|
* below — Next.js merges headers from every matching rule, so
|
||||||
|
* they apply to every response regardless of which cache rule
|
||||||
|
* matched.
|
||||||
*/
|
*/
|
||||||
async headers() {
|
async headers() {
|
||||||
return [
|
return [
|
||||||
@ -58,6 +116,13 @@ const nextConfig: NextConfig = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// Security headers on every response, including /_next/static
|
||||||
|
// assets (nosniff matters there) and /api/* (HSTS + referrer-
|
||||||
|
// policy don't hurt).
|
||||||
|
source: "/:path*",
|
||||||
|
headers: [...SECURITY_HEADERS],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user