Härdade applikationen med nonce‑baserad CSP, HSTS, SameSite‑cookies, databasroller med minsta behörighet och förnyade kontroller av åtkomsträttigheter på serversidan.
Arbetet utfört: 2025
försvar som håller när webbläsaren är fientlig
Situation. Plattformen lagrar yrkes- och organisationsdata, den sortens data som folk förväntar sig ska hanteras ordentligt, så en enda försvarslinje skulle aldrig räcka. Arbetsantagandet måste vara att klienten är fientlig — att allt som webbläsaren upprätthåller kan kopplas bort av den som sitter vid webbläsaren — och säkerheten måste hålla ändå.
Uppgift. Plattformen behövde härdas i varje lager — frontend, API, databas — så att säkerheten upprätthölls av servern oberoende av vad gränssnittet råkade tillåta.
Handling. I frontenden sätter middlewaren i Next.js — proxy.ts — en Content‑Security‑Policy med en nonce per anrop och strict‑dynamic, plus HSTS och SameSite‑cookies, så att webbläsaren är låst när det gäller vad den kör och skickar. I API:et finns hastighetsbegränsning, CORS, storleksgränser för anrop, validering av indata innan något når databasen och loggning av säkerhetsrelevanta händelser. I databasen loggar API:et in som en roll med minsta möjliga behörighet som bara får anropa appens funktioner med EXECUTE, funktionerna körs som SECURITY DEFINER och allt är parametriserat. Och rättigheterna — nivå, roll, organisation, avgränsning per fartyg — kontrolleras på nytt på servern vid varje anrop, medan spärrarna i frontenden enbart behandlas som UX. Spärrarna avgör vad du ser; servern avgör vad du får göra.
Resultat. Säkerheten hänger inte på att gränssnittet beter sig. Skydden ligger i lager så att den som tar sig förbi ett av dem inte därmed tar sig förbi resten, och det hela bygger på antagandet att klienten inte går att lita på — vilket är rätt antagande för data som människor lämnar över i förtroende.
Läs vidare: Byggde skydd mot missbruk som stänger vid fel — 22 hastighetsbegränsare i Redis, Cloudflare Turnstile, idempotenta anrop och ett ursprungslås — så att plattformen avvisar botar och anropsfloder i stället för att lita på sina anropare. Eller ta en titt på hela portföljen.
En del av en längre historik — och den finns i sin helhet här.
Varje post är skriven på samma sätt: situationen, uppgiften, vad vi gjorde och vad som förändrades.