mirror of
https://github.com/R0m1k3/PleinR.git
synced 2026-10-15 11:20:06 +02:00
Durcissement : mot de passe actuel, sessions révocables, dépendances, CSP, tests
Suite de l'audit : les cinq points laissés en suspens sont traités. Mot de passe - `changeOwnPassword` exige désormais le mot de passe actuel. Un poste laissé ouvert ne suffit plus à s'approprier un compte. Les erreurs reviennent sur l'écran avec un message au lieu d'une page d'erreur brute. Sessions révocables - Colonne `users.session_version`, portée dans le jeton et comparée à la base. - `getSession()` (src/lib/session.ts) remplace `auth()` sur les 20 pages et actions : rôle, rattachement adhérent et existence du compte sont relus à chaque requête. Supprimer un compte ou réinitialiser un mot de passe coupe immédiatement les sessions ouvertes, sans attendre l'expiration du jeton. Dépendances — de 8 vulnérabilités (2 critiques) à zéro - next 15.5.19 → 15.5.21, next-auth beta.25 → beta.32, drizzle-orm 0.38 → 0.45. - postcss et sharp forcés par `overrides` sur leurs versions corrigées, Next ne les ayant pas encore reprises ; drizzle-kit et esbuild montés côté outillage. - `npm audit fix --force` a été écarté : il proposait de RÉTROGRADER Next en 9.3.3 et eslint-config-next en 12, ce qui aurait cassé l'application. - `eslint-config-next` traînait dans node_modules sans être déclaré : retiré. CSP complète - Politique à nonce posée par le middleware, nonce régénéré à chaque requête, `script-src` sans 'unsafe-inline'. `style-src` garde 'unsafe-inline' : tout le design repose sur des attributs style, et une injection de style n'a pas la portée d'une injection de script. - Conséquence assumée : rendu dynamique pour toutes les pages, un HTML pré-généré ne pouvant pas porter de nonce. Tests - `npm test` (runner natif node:test via tsx), 18 tests sur le filtre XSS, la limitation des tentatives de connexion et le chiffrement des jetons. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
This commit is contained in:
36 files changed
+2151
-6053
No files matched your search
@@ -0,0 +1,56 @@
|
||||
import { eq } from "drizzle-orm";
|
||||
import { auth } from "@/auth";
|
||||
import { db } from "@/db";
|
||||
import { users } from "@/db/schema";
|
||||
import type { AppRole } from "@/types/next-auth";
|
||||
|
||||
/**
|
||||
* Session revalidée en base à chaque requête.
|
||||
*
|
||||
* Auth.js fige le rôle dans le jeton JWT : sans cette relecture, supprimer un
|
||||
* administrateur ou le rétrograder ne coupait pas sa session en cours, qui
|
||||
* restait valide jusqu'à expiration. On relit donc l'utilisateur à chaque appel
|
||||
* et on refuse le jeton si le compte a disparu ou si sa version de session a
|
||||
* changé (mot de passe modifié ou réinitialisé).
|
||||
*/
|
||||
|
||||
export type AppSession = {
|
||||
user: {
|
||||
id: string;
|
||||
name: string;
|
||||
email: string;
|
||||
role: AppRole;
|
||||
memberId: number | null;
|
||||
mustChangePassword: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
export async function getSession(): Promise<AppSession | null> {
|
||||
const session = await auth();
|
||||
const rawId = session?.user?.id;
|
||||
if (!rawId) return null;
|
||||
|
||||
const userId = Number(rawId);
|
||||
if (!Number.isFinite(userId)) return null;
|
||||
|
||||
const [user] = await db.select().from(users).where(eq(users.id, userId));
|
||||
// Compte supprimé : le jeton ne vaut plus rien.
|
||||
if (!user) return null;
|
||||
|
||||
const tokenVersion = Number(
|
||||
(session as { sessionVersion?: number }).sessionVersion ?? 0
|
||||
);
|
||||
if ((user.sessionVersion ?? 0) !== tokenVersion) return null;
|
||||
|
||||
// Le rôle et le rattachement adhérent viennent de la base, jamais du jeton.
|
||||
return {
|
||||
user: {
|
||||
id: String(user.id),
|
||||
name: user.name,
|
||||
email: user.email,
|
||||
role: user.role,
|
||||
memberId: user.memberId,
|
||||
mustChangePassword: user.mustChangePassword,
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user