From 2ee60108194b2ec3d98261b31b7f7284cdc26619 Mon Sep 17 00:00:00 2001 From: primrosehb-cmyk Date: Thu, 28 May 2026 10:53:32 +0200 Subject: [PATCH 01/12] update planeringsfasen --- .DS_Store | Bin 0 -> 6148 bytes planeringsfasen.md | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..14dbf5b1f9c618c069a228a2a7a7ee9053e46c06 GIT binary patch literal 6148 zcmeHKu};G<5IvWmrohk*#(V)%{~%Q13$ihw(gq5m!4)cd79=LVf$v~~i9dja0SP1| zB>tiAY}3Xh?Sv3QchdPe=R5oS9OYsnQr(NJL)0ds5X#tSp{WrbXRS!XSvG)*=NJt; z=|Jb>il-RC-N+FIEh u*V+i$gR-z+VR06Mjw!|PvW6& literal 0 HcmV?d00001 diff --git a/planeringsfasen.md b/planeringsfasen.md index 661cae0e..06cc0cb1 100644 --- a/planeringsfasen.md +++ b/planeringsfasen.md @@ -1 +1,32 @@ -# Inlämning 1 - Planeringsfasen \ No newline at end of file +# Inlämning 1 - Planeringsfasen +# YH Message App · Mikroblogg + +En webbapp som delar barns roliga händelser anonymt. +Användare skriver korta inlägg (max 140 tecken). + +# Systemet skyddar +Frontend → Backend/API → Databas + +## Identifierade hot + +### | Hot | Var | Konsekvens | STRIDE | +|---|-----|-----|------------|--------| +- | 1 | Brute force – gissar lösenord mot login | Backend | Konto komprometterat | S – Spoofing | +- | 2 | IDOR – inloggad manipulerar andras inlägg via ID:n | Backend | Integritetsbrott | T – Tampering | +- | 3 | Okrypterade lösenord – klartext i databasen | Databas | Alla lösenord exponerade | I – Information Disclosure | +- | 4 | Obehörigt skapande – ej inloggad når API:t | Backend | Obehörigt innehåll | E – Elevation of Privilege | +- | 5 | XSS – skadlig kod injiceras i meddelande | Frontend + Backend + Databas | Kod körs i andras webbläsare | T – Tampering | +- | 6 | Känslig barndata – barninfo exponeras | Databas | Integritetsskada | I – Information Disclosure | +- | 7 | SQL-injektion – skadlig SQL når databasen | Frontend + Backend + Databas | Dataläckage eller radering | T – Tampering | + + +# Säkerhetskrav + + ## | Krav | Beskrivning | Skyddar mot | +|---|------|-------------|-------------| +- 1 | Registrering | Unikt användarnamn. Lösenord hashas med bcrypt, aldrig klartext | Hot 1 & 3 | +- 2 | Accesskontroll | Användare ska endast kunna redigera och ta bort sina egna meddelanden, aldrig andras | Hot 2 | +- 3 | Autentisering | Endast inloggade användare får skapa, redigera och ta bort meddelanden. Ej inloggade får HTTP 401 | Hot 4 | +- 4 | XSS-skydd | All användarinmatning saneras innan den sparas i databasen och visas för andra användare | Hot 5 | +- 5 | Barnens anonymitet | Ingen identifierbar information om barn (namn, ålder, ort) sparas eller visas. Endast ålderskategori är tillåtet | Hot 6 | +- 6 | SQL-skydd | API:t skyddar mot SQL-injektion genom parametriserade förfrågningar | Hot 7 | From 954528bf2c64b003fec8af3a0ef37fe219fdbc05 Mon Sep 17 00:00:00 2001 From: primrosehb-cmyk Date: Thu, 28 May 2026 10:54:05 +0200 Subject: [PATCH 02/12] update planeringsfasen --- .DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 14dbf5b1f9c618c069a228a2a7a7ee9053e46c06..ed680a4af5ced2c53f3cfcccb01b10804084a39f 100644 GIT binary patch delta 106 zcmZoMXffEJ#uWS7jDdlHg+Y%YogtH<#~sPZXz Date: Wed, 3 Jun 2026 13:57:03 +0200 Subject: [PATCH 03/12] password lenght requirment --- backend/models/User.js | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/models/User.js b/backend/models/User.js index 266a60b4..2485a783 100644 --- a/backend/models/User.js +++ b/backend/models/User.js @@ -14,6 +14,7 @@ const userSchema = new mongoose.Schema({ unique: true, lowercase: true, }, + // Password length requirements: Password must be at least 8 characters password: { type: String, required: true, From 06bf411580030d7e1e6d9d44eb655d403638fe1b Mon Sep 17 00:00:00 2001 From: martina Date: Wed, 3 Jun 2026 14:48:18 +0200 Subject: [PATCH 04/12] Delete btn available to all --- frontend/src/components/SingleMessage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/SingleMessage.jsx b/frontend/src/components/SingleMessage.jsx index 50d2274b..f45138eb 100644 --- a/frontend/src/components/SingleMessage.jsx +++ b/frontend/src/components/SingleMessage.jsx @@ -81,7 +81,7 @@ export const SingleMessage = ({ message, user, onUnauthorized, fetchPosts }) => )} - +//Radera-knappen ligger utanför isOwner-kontrollen — den visas för alla, även inloggade användare som inte äger meddelandet.Båda DELETE-problemen hänger ihop och behöver fixas på båda backend och frontend för att kravet ska vara uppfyllt.
From f15db0eccd3520ac2411c6e034d6faa4056269da Mon Sep 17 00:00:00 2001 From: martina Date: Thu, 4 Jun 2026 13:15:24 +0200 Subject: [PATCH 05/12] logins limits --- backend/models/User.js | 4 ++-- backend/server.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/models/User.js b/backend/models/User.js index 2485a783..339cce59 100644 --- a/backend/models/User.js +++ b/backend/models/User.js @@ -1,5 +1,5 @@ import mongoose from "mongoose" - +// Password length requirements: Password must be at least 8 characters long and contain at least one uppercase letter, one lowercase letter, one number, and one special character. const userSchema = new mongoose.Schema({ username: { type: String, @@ -14,7 +14,7 @@ const userSchema = new mongoose.Schema({ unique: true, lowercase: true, }, - // Password length requirements: Password must be at least 8 characters + password: { type: String, required: true, diff --git a/backend/server.js b/backend/server.js index c8d0c218..a7d0eb77 100644 --- a/backend/server.js +++ b/backend/server.js @@ -72,7 +72,7 @@ app.post("/register", async (req, res) => { }) } }) - +//ingen begränsning på inloggningsförsök, öppet för brute force-attacker, lägg in maxförsök på 10 ggr per IP, per dygn. app.post("/login", async (req, res) => { try { const { login, password } = req.body From 30f7661978cdafb0d758997038ab329d0dc6bc88 Mon Sep 17 00:00:00 2001 From: primrosehb-cmyk Date: Thu, 4 Jun 2026 14:06:06 +0200 Subject: [PATCH 06/12] =?UTF-8?q?Fas=202:=20Kommentar=20om=20informationsl?= =?UTF-8?q?=C3=A4ckage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes yh-message-app-fullstack | 1 + 2 files changed, 1 insertion(+) create mode 160000 yh-message-app-fullstack diff --git a/.DS_Store b/.DS_Store index ed680a4af5ced2c53f3cfcccb01b10804084a39f..2882c4b87a358dc217f673fec4dab80d702aaec2 100644 GIT binary patch delta 106 zcmZoMXffEJ#uWRpgMop8g+Y%YogtH Date: Thu, 4 Jun 2026 14:08:08 +0200 Subject: [PATCH 07/12] login limits --- backend/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/server.js b/backend/server.js index a7d0eb77..683a8bbb 100644 --- a/backend/server.js +++ b/backend/server.js @@ -24,7 +24,7 @@ app.use(express.json()) app.get("/", (req, res) => { res.send(listEndpoints(app)) }) - +//ingen begränsning på inloggningsförsök, öppet för brute force-attacker, lägg in maxförsök på 10 ggr per IP, per dygn. app.post("/register", async (req, res) => { try { const { email, password, username } = req.body @@ -72,7 +72,7 @@ app.post("/register", async (req, res) => { }) } }) -//ingen begränsning på inloggningsförsök, öppet för brute force-attacker, lägg in maxförsök på 10 ggr per IP, per dygn. + app.post("/login", async (req, res) => { try { const { login, password } = req.body From 4a24cc4c0fe9a91c11b4a41f39f8d65a24c6bdf6 Mon Sep 17 00:00:00 2001 From: martina Date: Thu, 4 Jun 2026 14:35:36 +0200 Subject: [PATCH 08/12] Radera knappen --- frontend/src/components/SingleMessage.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/SingleMessage.jsx b/frontend/src/components/SingleMessage.jsx index f45138eb..fb0e36b4 100644 --- a/frontend/src/components/SingleMessage.jsx +++ b/frontend/src/components/SingleMessage.jsx @@ -81,7 +81,10 @@ export const SingleMessage = ({ message, user, onUnauthorized, fetchPosts }) =>
)} -//Radera-knappen ligger utanför isOwner-kontrollen — den visas för alla, även inloggade användare som inte äger meddelandet.Båda DELETE-problemen hänger ihop och behöver fixas på båda backend och frontend för att kravet ska vara uppfyllt. + {/* Här är en kommentar Radera-knappen ligger utanför isOwner-kontrollen — den visas för + alla, även inloggade användare som inte äger meddelandet.Båda + DELETE-problemen hänger ihop och behöver fixas på båda backend och + frontend för att kravet ska vara uppfyllt.*/}
From 0c9b1f918fb3b63ceb493aba6a2f631490337ef8 Mon Sep 17 00:00:00 2001 From: primrosehb-cmyk Date: Fri, 5 Jun 2026 11:51:44 +0200 Subject: [PATCH 09/12] =?UTF-8?q?Fas=202:=20S=C3=A4kerhetskommentarer=20Kr?= =?UTF-8?q?av=201,=202=20och=20informationsl=C3=A4ckage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/server.js | 9 ++++++++- yh-message-app-fullstack | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) delete mode 160000 yh-message-app-fullstack diff --git a/backend/server.js b/backend/server.js index 683a8bbb..3ffb6ae9 100644 --- a/backend/server.js +++ b/backend/server.js @@ -28,11 +28,18 @@ app.get("/", (req, res) => { app.post("/register", async (req, res) => { try { const { email, password, username } = req.body +// KRAV 1 - Del 2: Input validering av användarnamn +// Kontrollerar att användarnamnet inte är tomt och minst 2 tecken +// Kopplar till Input Validation — lita aldrig på input från användaren +// SAKNAS: Lösenordslängd valideras inte +// Borde finnas: if (password.length < 8) { return fel } if (!username || username.trim().length < 2) { return res.status(400).json({ success: false, message: "Username must be at least 2 characters" }) } - +// KRAV 1: Kontrollerar att användarnamn och email är unika +// Söker i databasen — finns användaren redan stoppas registreringen +// Skyddar mot Spoofing (S i STRIDE) — ingen kan ta någon annans identitet const existingUser = await User.findOne({ $or: [{ email: email.toLowerCase() }, { username: username.trim() }] }) diff --git a/yh-message-app-fullstack b/yh-message-app-fullstack deleted file mode 160000 index f15db0ec..00000000 --- a/yh-message-app-fullstack +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f15db0eccd3520ac2411c6e034d6faa4056269da From 979027dfe12188f5c17354650be2430478a34fe3 Mon Sep 17 00:00:00 2001 From: primrosehb-cmyk Date: Thu, 11 Jun 2026 15:39:16 +0200 Subject: [PATCH 10/12] Fas3-granskning-sammanfattning --- Fas3-granskning-sammanfattning | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Fas3-granskning-sammanfattning diff --git a/Fas3-granskning-sammanfattning b/Fas3-granskning-sammanfattning new file mode 100644 index 00000000..d91db527 --- /dev/null +++ b/Fas3-granskning-sammanfattning @@ -0,0 +1,45 @@ +Fas 3 – Säkerhetsgranskning +Verktyg +I Fas 3 granskade vi applikationen med tre säkerhetsverktyg inbyggda i GitHub: +Dependabot (SCA – Software Composition Analysis): Jämför våra npm-paket mot GitHub Advisory Database, en global databas med kända sårbarheter. Varje sårbarhet har ett unikt CVE-nummer som används av utvecklare och verktyg världen över. +CodeQL (SAST – Static Application Security Testing): Analyserar vår egen kod statiskt utan att köra den och letar efter farliga mönster. +Secret scanning: Söker igenom repot efter hemligheter som API-nycklar eller lösenord som råkat hamna i koden. +Verktygen hittade totalt 24 fynd. Vi fördjupade oss i två. + +Fynd +Sårbarhet 1 – Missing rate limiting (CodeQL, High) +CodeQL identifierade att login-routen på rad 83 i server.js saknar rate limiting. Det finns ingen begränsning för hur många inloggningsförsök en användare får göra. En angripare kan automatiskt skicka tusentals lösenordsförsök per minut tills rätt lösenord hittas — en så kallad brute force-attack. +Kopplingar: + +OWASP A07 – Identification and Authentication Failures +Säkerhetsprincip: Fail Secure — systemet ska neka vid fel, inte fortsätta acceptera försök +Säkerhetsprincip: Defense in Depth — rate limiting är ett extra skyddslager utöver lösenordet +STRIDE: Spoofing + +Åtgärd: Lägg till express-rate-limit på /login och /register. Efter 10 misslyckade försök på 15 minuter blockeras IP-adressen automatiskt. + +Sårbarhet 2 – jsonwebtoken (Dependabot, High + Moderate) +Dependabot hittade tre kända sårbarheter i paketet jsonwebtoken — ett High (CVE-2022-23539, severity 8.1/10) och två Moderate. Detta är ett direkt beroende som används i produktion för att skapa och verifiera JWT-tokens. Affected versions: <= 8.5.1. Patched version: 9.0.0. +JWT är hela grunden för vår autentisering. Om tokens kan förfalskas kan en angripare logga in som en annan användare. Detta är extra allvarligt eftersom appen hanterar anonyma barnhistorier — en angripare som tar över ett konto kan posta olämpligt innehåll under någon annans identitet, vilket bryter mot säkerhetskrav 5 från Fas 1. +I Fas 2 identifierades att DELETE-routen saknar autentisering. De två sårbarheterna förstärker varandra — en angripare kan förfalska ett token och radera andras inlägg utan att ha loggat in legitimt. +Kopplingar: + +OWASP A02 – Cryptographic Failures +Säkerhetsprincip: Shift Left — sårbarheten hade kunnat fångas tidigare om paketversioner kontrollerats från start +Säkerhetsprincip: Defense in Depth — om JWT brister behövs fler skyddslager, t.ex. autentisering på DELETE-routen +STRIDE: Tampering + +Åtgärd: Uppdatera jsonwebtoken till version 9.0.0. Dependabot kan skapa en automatisk pull request som gör det åt oss — alla tre CVE:erna åtgärdas på en gång. + +Positivt fynd – Secret scanning +Secret scanning hittade noll fynd. Det bekräftar att vår JWT_SECRET — nyckeln som signerar alla våra tokens — aldrig har råkat hamna i koden på GitHub. Om den nyckeln läckte ut skulle vem som helst kunna skapa giltiga tokens och logga in som vem som helst i appen. + +Prioriterade åtgärder + +Uppdatera jsonwebtoken till version 9.0.0 +Lägg till rate limiting med express-rate-limit på /login och /register +Lägg till authenticateUser på DELETE-routen + +Slutsats +Verktygen bekräftade hot vi redan hade identifierat manuellt i Fas 1. Brute force var hot nummer 1 i vår hotmodellering — CodeQL bekräftade att skyddet saknas i koden. Vi identifierade autentisering som säkerhetskrav 3 — Dependabot bekräftade att paketet vi använder har kända CVE:er. +Det visar att hotmodellering och automatiserade verktyg kompletterar varandra. Verktygen ersätter inte tänkandet — men de bekräftar och preciserar var i koden problemen faktiskt finns. From 34d16673b864a2160f8407d06c845df8ce7d1ad5 Mon Sep 17 00:00:00 2001 From: primrosehb-cmyk Date: Thu, 11 Jun 2026 15:40:49 +0200 Subject: [PATCH 11/12] Rename Fas3-granskning-sammanfattning to Fas3-granskning-sammanfattning.md --- ...granskning-sammanfattning => Fas3-granskning-sammanfattning.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Fas3-granskning-sammanfattning => Fas3-granskning-sammanfattning.md (100%) diff --git a/Fas3-granskning-sammanfattning b/Fas3-granskning-sammanfattning.md similarity index 100% rename from Fas3-granskning-sammanfattning rename to Fas3-granskning-sammanfattning.md From 06d0880ad365a684b35efccee9ac7bd7f2d55f54 Mon Sep 17 00:00:00 2001 From: primrosehb-cmyk Date: Thu, 11 Jun 2026 15:43:51 +0200 Subject: [PATCH 12/12] Fas3-granskning-sammanfattning.md Updated the security review document for Phase 3, including tools used, findings, and prioritized actions. --- Fas3-granskning-sammanfattning.md | 82 ++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/Fas3-granskning-sammanfattning.md b/Fas3-granskning-sammanfattning.md index d91db527..1beba41c 100644 --- a/Fas3-granskning-sammanfattning.md +++ b/Fas3-granskning-sammanfattning.md @@ -1,45 +1,69 @@ -Fas 3 – Säkerhetsgranskning -Verktyg +# Fas 3 – Säkerhetsgranskning + +## Verktyg + I Fas 3 granskade vi applikationen med tre säkerhetsverktyg inbyggda i GitHub: -Dependabot (SCA – Software Composition Analysis): Jämför våra npm-paket mot GitHub Advisory Database, en global databas med kända sårbarheter. Varje sårbarhet har ett unikt CVE-nummer som används av utvecklare och verktyg världen över. -CodeQL (SAST – Static Application Security Testing): Analyserar vår egen kod statiskt utan att köra den och letar efter farliga mönster. -Secret scanning: Söker igenom repot efter hemligheter som API-nycklar eller lösenord som råkat hamna i koden. + +- **Dependabot** (SCA – Software Composition Analysis): Jämför våra npm-paket mot GitHub Advisory Database, en global databas med kända sårbarheter. Varje sårbarhet har ett unikt CVE-nummer som används av utvecklare och verktyg världen över. +- **CodeQL** (SAST – Static Application Security Testing): Analyserar vår egen kod statiskt utan att köra den och letar efter farliga mönster. +- **Secret scanning**: Söker igenom repot efter hemligheter som API-nycklar eller lösenord som råkat hamna i koden. + Verktygen hittade totalt 24 fynd. Vi fördjupade oss i två. -Fynd -Sårbarhet 1 – Missing rate limiting (CodeQL, High) -CodeQL identifierade att login-routen på rad 83 i server.js saknar rate limiting. Det finns ingen begränsning för hur många inloggningsförsök en användare får göra. En angripare kan automatiskt skicka tusentals lösenordsförsök per minut tills rätt lösenord hittas — en så kallad brute force-attack. -Kopplingar: +--- + +## Fynd + +### Sårbarhet 1 – Missing rate limiting (CodeQL, High) + +CodeQL identifierade att login-routen på rad 83 i `server.js` saknar rate limiting. Det finns ingen begränsning för hur många inloggningsförsök en användare får göra. En angripare kan automatiskt skicka tusentals lösenordsförsök per minut tills rätt lösenord hittas — en så kallad brute force-attack. + +**Kopplingar:** +- OWASP A07 – Identification and Authentication Failures +- Säkerhetsprincip: Fail Secure — systemet ska neka vid fel, inte fortsätta acceptera försök +- Säkerhetsprincip: Defense in Depth — rate limiting är ett extra skyddslager utöver lösenordet +- STRIDE: Spoofing + +**Åtgärd:** Lägg till `express-rate-limit` på `/login` och `/register`. Efter 10 misslyckade försök på 15 minuter blockeras IP-adressen automatiskt. -OWASP A07 – Identification and Authentication Failures -Säkerhetsprincip: Fail Secure — systemet ska neka vid fel, inte fortsätta acceptera försök -Säkerhetsprincip: Defense in Depth — rate limiting är ett extra skyddslager utöver lösenordet -STRIDE: Spoofing +--- -Åtgärd: Lägg till express-rate-limit på /login och /register. Efter 10 misslyckade försök på 15 minuter blockeras IP-adressen automatiskt. +### Sårbarhet 2 – jsonwebtoken (Dependabot, High + Moderate) + +Dependabot hittade tre kända sårbarheter i paketet `jsonwebtoken` — ett High (CVE-2022-23539, severity 8.1/10) och två Moderate. Detta är ett direkt beroende som används i produktion för att skapa och verifiera JWT-tokens. Affected versions: <= 8.5.1. Patched version: 9.0.0. -Sårbarhet 2 – jsonwebtoken (Dependabot, High + Moderate) -Dependabot hittade tre kända sårbarheter i paketet jsonwebtoken — ett High (CVE-2022-23539, severity 8.1/10) och två Moderate. Detta är ett direkt beroende som används i produktion för att skapa och verifiera JWT-tokens. Affected versions: <= 8.5.1. Patched version: 9.0.0. JWT är hela grunden för vår autentisering. Om tokens kan förfalskas kan en angripare logga in som en annan användare. Detta är extra allvarligt eftersom appen hanterar anonyma barnhistorier — en angripare som tar över ett konto kan posta olämpligt innehåll under någon annans identitet, vilket bryter mot säkerhetskrav 5 från Fas 1. + I Fas 2 identifierades att DELETE-routen saknar autentisering. De två sårbarheterna förstärker varandra — en angripare kan förfalska ett token och radera andras inlägg utan att ha loggat in legitimt. -Kopplingar: -OWASP A02 – Cryptographic Failures -Säkerhetsprincip: Shift Left — sårbarheten hade kunnat fångas tidigare om paketversioner kontrollerats från start -Säkerhetsprincip: Defense in Depth — om JWT brister behövs fler skyddslager, t.ex. autentisering på DELETE-routen -STRIDE: Tampering +**Kopplingar:** +- OWASP A02 – Cryptographic Failures +- Säkerhetsprincip: Shift Left — sårbarheten hade kunnat fångas tidigare om paketversioner kontrollerats från start +- Säkerhetsprincip: Defense in Depth — om JWT brister behövs fler skyddslager, t.ex. autentisering på DELETE-routen +- STRIDE: Tampering + +**Åtgärd:** Uppdatera jsonwebtoken till version 9.0.0. Dependabot kan skapa en automatisk pull request som gör det åt oss — alla tre CVE:erna åtgärdas på en gång. + +--- + +## Positivt fynd – Secret scanning -Åtgärd: Uppdatera jsonwebtoken till version 9.0.0. Dependabot kan skapa en automatisk pull request som gör det åt oss — alla tre CVE:erna åtgärdas på en gång. +Secret scanning hittade noll fynd. Det bekräftar att vår `JWT_SECRET` — nyckeln som signerar alla våra tokens — aldrig har råkat hamna i koden på GitHub. Om den nyckeln läckte ut skulle vem som helst kunna skapa giltiga tokens och logga in som vem som helst i appen. -Positivt fynd – Secret scanning -Secret scanning hittade noll fynd. Det bekräftar att vår JWT_SECRET — nyckeln som signerar alla våra tokens — aldrig har råkat hamna i koden på GitHub. Om den nyckeln läckte ut skulle vem som helst kunna skapa giltiga tokens och logga in som vem som helst i appen. +--- -Prioriterade åtgärder +## Prioriterade åtgärder -Uppdatera jsonwebtoken till version 9.0.0 -Lägg till rate limiting med express-rate-limit på /login och /register -Lägg till authenticateUser på DELETE-routen +1. Uppdatera `jsonwebtoken` till version 9.0.0 +2. Lägg till rate limiting med `express-rate-limit` på `/login` och `/register` +3. Lägg till `authenticateUser` på DELETE-routen + +Notering: Många av Dependabots övriga fynd gäller `devDependencies` — paket som bara används under utveckling och inte i produktion. De är lägre prioritet. + +--- + +## Slutsats -Slutsats Verktygen bekräftade hot vi redan hade identifierat manuellt i Fas 1. Brute force var hot nummer 1 i vår hotmodellering — CodeQL bekräftade att skyddet saknas i koden. Vi identifierade autentisering som säkerhetskrav 3 — Dependabot bekräftade att paketet vi använder har kända CVE:er. + Det visar att hotmodellering och automatiserade verktyg kompletterar varandra. Verktygen ersätter inte tänkandet — men de bekräftar och preciserar var i koden problemen faktiskt finns.