[Majeur] Mots de passe sans politique côté API (1 caractère ou vide accepté) et sans révocation des sessions #113

Closed
opened 2026-10-28 10:32:07 +00:00 by asventi · 0 comments
Owner

Gravité : Majeur
Rapports QA d'origine : AUTH-05, AUTH-17, ADMIN-08, PROFILE-06

La règle des 8 caractères n'existe que dans l'UI ; le reset admin accepte "" ; les sessions existantes ne sont pas révoquées. Voir aussi #69.

Détails des rapports

[AUTH-05] Le serveur accepte des mots de passe de 1 caractère et des usernames/valeurs sans règle (validation seulement côté UI) — Gravité : Mineur
  • Où : POST /api/auth/register
  • Obtenu : password a -> 201 ; password 12345678 -> 201 ; username a, qa_auth_<img src=x onerror=alert(1)>, qa_auth_'; DROP TABLE Users;--, qa_auth_‮RTL (override RTL), tabulation, 255 caractères -> 201. L'UI impose pourtant mot de passe >= 8 (AuthForm.tsx:137) et username <= 25 (AuthForm.tsx:94), email a b@qa.test, <script>@qa.test, a@b acceptés (validateur [EmailAddress] .NET très permissif).
  • Cause probable : backend/API/Auth/Register/RegisterEndpoint.cs:7-18 (seulement Length(1,255)).
[AUTH-17] Réinitialisation de mot de passe sans politique ni révocation des sessions — Gravité : Mineur
  • Où : PATCH /api/auth/{id}/password (body JSON string)
  • Obtenu : mot de passe "" -> 200 (le user ne peut plus se connecter car Password est requis au login), "a" -> 200, 300 caractères -> 200, 100 000 caractères -> 200 (alors que l'inscription limite à 1-255 et l'UI à 8+). Les sessions existantes du user (access 10 min + refresh) restent valides après le reset : /me 200 et /auth/refresh 200 avec l'ancienne session (le logout est commenté dans ResetPasswordEndpoint.cs:21-25).
  • Cause probable : ResetPasswordEndpoint.cs:13-27, ResetPasswordQuery.cs:27.
[ADMIN-08] Réinitialisation de mot de passe : l'API accepte un mot de passe vide ou d'1 caractère — Gravité : Majeur
  • Où : PATCH /api/auth/{id}/password
  • Obtenu : 200 avec les corps "", "a", "short" (l'UI impose min 8, l'API aucune validation). Un mot de passe vide peut donc être posé sur un compte.
  • Cause probable : backend/API/Auth/Reset/ResetPasswordEndpoint.cs:13 : [FromBody] string password sans validation ; ResetPasswordQuery.cs.
[PROFILE-06] Mot de passe : aucune longueur minimale côté API (1 caractère accepté), l'UI exige 8 — Gravité : Mineur
  • Où : PATCH /api/me/password (et register : [Length(1,255)])
  • Étapes : PATCH /api/me/password {"password":<actuel>,"newPassword":"1"}.
  • Attendu : 400 (>= 8 comme dans l'UI Profile.tsx:141).
  • Obtenu : 200, mot de passe = "1" (login "1" -> 200).
  • Cause probable : backend/API/Users/Me/Update/UpdateMePassEndpoint.cs:9-13 (seulement [Required]).

Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes.

**Gravité :** Majeur **Rapports QA d'origine :** AUTH-05, AUTH-17, ADMIN-08, PROFILE-06 La règle des 8 caractères n'existe que dans l'UI ; le reset admin accepte `""` ; les sessions existantes ne sont pas révoquées. Voir aussi #69. ## Détails des rapports <details><summary>[AUTH-05] Le serveur accepte des mots de passe de 1 caractère et des usernames/valeurs sans règle (validation seulement côté UI) — Gravité : Mineur</summary> - Où : `POST /api/auth/register` - Obtenu : password `a` -> 201 ; password `12345678` -> 201 ; username `a`, `qa_auth_<img src=x onerror=alert(1)>`, `qa_auth_'; DROP TABLE Users;--`, `qa_auth_‮RTL` (override RTL), tabulation, 255 caractères -> 201. L'UI impose pourtant mot de passe >= 8 (`AuthForm.tsx:137`) et username <= 25 (`AuthForm.tsx:94`), email `a b@qa.test`, `<script>@qa.test`, `a@b` acceptés (validateur [EmailAddress] .NET très permissif). - Cause probable : `backend/API/Auth/Register/RegisterEndpoint.cs:7-18` (seulement `Length(1,255)`). </details> <details><summary>[AUTH-17] Réinitialisation de mot de passe sans politique ni révocation des sessions — Gravité : Mineur</summary> - Où : `PATCH /api/auth/{id}/password` (body JSON string) - Obtenu : mot de passe `""` -> 200 (le user ne peut plus se connecter car `Password` est requis au login), `"a"` -> 200, 300 caractères -> 200, 100 000 caractères -> 200 (alors que l'inscription limite à 1-255 et l'UI à 8+). Les sessions existantes du user (access 10 min + refresh) restent valides après le reset : `/me` 200 et `/auth/refresh` 200 avec l'ancienne session (le logout est commenté dans `ResetPasswordEndpoint.cs:21-25`). - Cause probable : `ResetPasswordEndpoint.cs:13-27`, `ResetPasswordQuery.cs:27`. </details> <details><summary>[ADMIN-08] Réinitialisation de mot de passe : l'API accepte un mot de passe vide ou d'1 caractère — Gravité : Majeur</summary> - Où : `PATCH /api/auth/{id}/password` - Obtenu : 200 avec les corps `""`, `"a"`, `"short"` (l'UI impose min 8, l'API aucune validation). Un mot de passe vide peut donc être posé sur un compte. - Cause probable : `backend/API/Auth/Reset/ResetPasswordEndpoint.cs:13` : `[FromBody] string password` sans validation ; `ResetPasswordQuery.cs`. </details> <details><summary>[PROFILE-06] Mot de passe : aucune longueur minimale côté API (1 caractère accepté), l'UI exige 8 — Gravité : Mineur</summary> - Où : `PATCH /api/me/password` (et register : `[Length(1,255)]`) - Étapes : `PATCH /api/me/password {"password":<actuel>,"newPassword":"1"}`. - Attendu : 400 (>= 8 comme dans l'UI `Profile.tsx:141`). - Obtenu : 200, mot de passe = "1" (login "1" -> 200). - Cause probable : `backend/API/Users/Me/Update/UpdateMePassEndpoint.cs:9-13` (seulement `[Required]`). </details> --- _Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes._
tjooris self-assigned this 2026-10-28 13:15:52 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transcendence/backend#113
No description provided.