docs: update security status in technical documentation for backend and Flutter frontend
Test Suite / test (24.15.0) (push) Has been cancelled
Test Suite / test (24.15.0) (push) Has been cancelled
- Added detailed security status section in backend documentation, outlining implemented security features and remaining risks as of 2026-05-07. - Included security features implemented in Flutter, emphasizing auth-gating, token storage, and limitations regarding web security.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -95,6 +95,37 @@ Detta dokument är skrivet för systemadministratörer och programmerare. Fokus
|
|||||||
### Driftnotering
|
### Driftnotering
|
||||||
Verifiera efter deploy att seed-körning inkluderar uppdaterat kategoriträd och att kvittoflödet använder den senaste regelbaserade parserlogiken.
|
Verifiera efter deploy att seed-körning inkluderar uppdaterat kategoriträd och att kvittoflödet använder den senaste regelbaserade parserlogiken.
|
||||||
|
|
||||||
|
## Sakerhetsstatus (2026-05-07)
|
||||||
|
|
||||||
|
Denna sektion beskriver sakerhetsfunktioner som ar implementerade i kodbasen och hur de ar implementerade tekniskt.
|
||||||
|
|
||||||
|
### Implementerat i backend
|
||||||
|
|
||||||
|
- JWT-skydd globalt: `JwtAuthGuard` ar registrerad som global APP_GUARD i `backend/src/app.module.ts`. Alla endpoints kravs pa giltig bearer-token om de inte ar markerade med `@Public()`.
|
||||||
|
- Rollbaserad access: `RolesGuard` ar global guard och laser metadata fran `@Roles(...)`. Endpoints med adminkrav blockerar icke-admin med `ForbiddenException`.
|
||||||
|
- Rate limiting: `ThrottlerGuard` ar globalt aktiv med standard 120 anrop/minut. Login/register har hardare throttle (`10/min`) i `auth.controller.ts`.
|
||||||
|
- Input-hardening: global `ValidationPipe` i `backend/src/main.ts` med `whitelist: true`, `forbidNonWhitelisted: true`, `transform: true`.
|
||||||
|
Detta tar bort odefinierade falt och nekar payloads med extra fields.
|
||||||
|
- Security headers: `helmet(...)` ar aktiverat i `backend/src/main.ts` med HSTS, `x-frame-options`, `x-content-type-options`, referrer policy och cross-origin policies.
|
||||||
|
- CORS-begransning: origin satts via `ALLOWED_ORIGIN` (fallback host i kod) och credentials ar explicit styrda i `main.ts`.
|
||||||
|
- Losenordshashning: `bcryptjs` med kostnad 12 i `auth.service.ts` (`bcrypt.hash(password, 12)`).
|
||||||
|
- User-scope i flera domaner:
|
||||||
|
- `recipes`: controllers/services skickar vidare `@CurrentUser().userId` och filtrerar pa agarskap.
|
||||||
|
- `pantry` och `meal-plan`: alla las/skriv-operationer ar user-scopade via `userId` i service-lagret.
|
||||||
|
- `receipt-alias`: las/skriv/radera styrs av owner/global-regler och aktuell anvandare.
|
||||||
|
|
||||||
|
### Delvis implementerat / kvarvarande risk
|
||||||
|
|
||||||
|
- Inventory ar inte fullstandigt user-scopat:
|
||||||
|
- `InventoryItem` saknar `userId` i `backend/prisma/schema.prisma`.
|
||||||
|
- `inventory.controller.ts` anvander inte `@CurrentUser()` for filtrering/auktorisering.
|
||||||
|
- Detta ar en kvarvarande IDOR/Full Table Dump-risk tills inventory ar migrerat till user-scope.
|
||||||
|
|
||||||
|
### Driftrelaterad hardening som finns
|
||||||
|
|
||||||
|
- Secrets injiceras via miljo i `compose.yml` (t.ex. `JWT_SECRET`, `DATABASE_URL`, API-nycklar) och ar inte hardkodade i appkod.
|
||||||
|
- Prisma migrationer kor vid containerstart och recovery-playbook for P3009 finns dokumenterad i detta dokument.
|
||||||
|
|
||||||
## Översikt
|
## Översikt
|
||||||
|
|
||||||
Recipe App är en fullstack-applikation för hantering av hemmavaror, recept och matplanering. Systemet är byggt med Next.js (frontend), NestJS (backend), Prisma ORM och MariaDB. Applikationen är containeriserad med Docker och använder Caddy som reverse proxy.
|
Recipe App är en fullstack-applikation för hantering av hemmavaror, recept och matplanering. Systemet är byggt med Next.js (frontend), NestJS (backend), Prisma ORM och MariaDB. Applikationen är containeriserad med Docker och använder Caddy som reverse proxy.
|
||||||
|
|||||||
@@ -44,6 +44,31 @@ Bygg och drift sker pa Linux/Ubuntu i containeriserad miljo.
|
|||||||
- Auth-gate i router med redirect logik
|
- Auth-gate i router med redirect logik
|
||||||
- `guardedApiCall()` hanterar logout vid 401
|
- `guardedApiCall()` hanterar logout vid 401
|
||||||
|
|
||||||
|
## Sakerhetsstatus (2026-05-07)
|
||||||
|
|
||||||
|
Denna sektion sammanfattar sakerhetsfunktioner som ar implementerade i Flutter-klienten och hur de fungerar tekniskt.
|
||||||
|
|
||||||
|
### Implementerat i Flutter
|
||||||
|
|
||||||
|
- Auth-gating i routing:
|
||||||
|
- Router-lagret stoppar navigation till skyddade vyer utan token/session.
|
||||||
|
- Om backend returnerar 401 i ett skyddat API-flode hanterar `guardedApiCall()` detta och triggar logout/omdirigering.
|
||||||
|
- Token-lagring via plattformsabstraktion:
|
||||||
|
- `ITokenStorage` definierar kontraktet (`getToken/saveToken/deleteToken`).
|
||||||
|
- Web-implementation (`WebTokenStorage`) lagrar token i `SharedPreferences` (web: localStorage).
|
||||||
|
- Arkitekturen gor att mobil implementation kan bytas till `flutter_secure_storage` utan att ovrig appkod andras.
|
||||||
|
- Minimerad klientside-auktorisering:
|
||||||
|
- Flutter forlitar sig pa backend som auktoritetskalla for access-kontroll.
|
||||||
|
- Klienten skickar bearer-token men gor inte egen resurstagarskapslogik som kan divergera fran serverregler.
|
||||||
|
- Kontraktsstyrd API-hantering:
|
||||||
|
- API-lagret accepterar 2xx pa importanrop och centraliserar felhantering.
|
||||||
|
- Minskar risken for ad-hoc felhantering i UI och inkonsekvent beteende vid auth-fel.
|
||||||
|
|
||||||
|
### Viktig begransning (web)
|
||||||
|
|
||||||
|
- Flutter Web kan inte anvanda `httpOnly` cookies enbart pa klientsidan.
|
||||||
|
- Nuvarande lagring i localStorage ar en praktisk kompromiss for web och innebar att XSS-hardening pa frontend och strict backend-headers/CSP ar fortsatt viktiga.
|
||||||
|
|
||||||
## API- och kontraktsprinciper
|
## API- och kontraktsprinciper
|
||||||
|
|
||||||
- Flutter foljer backend-kontrakt, ingen lokal speciallogik for matchning.
|
- Flutter foljer backend-kontrakt, ingen lokal speciallogik for matchning.
|
||||||
|
|||||||
Reference in New Issue
Block a user