From 093b96b9ae03bdea5ca74e07df17928ec920cc4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 30 May 2026 16:49:35 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20CSRF=20403=20=E2=80=94=20=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=8C=20=D1=82=D0=BE=D0=BA=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B8=D0=B7=20body=20(=5Fcsrf),=20cookieName=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20=5F=5FHost-=20(v0.4.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/middleware/csrf.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3d64361..d6d3c89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.3.0", + "version": "0.4.0", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/src/middleware/csrf.js b/src/middleware/csrf.js index 2da34d5..b4fbcbd 100644 --- a/src/middleware/csrf.js +++ b/src/middleware/csrf.js @@ -42,6 +42,16 @@ function initCsrf() { // Если сессии нет — пустая строка (допустимо для /login до установки сессии). getSessionIdentifier: (req) => req.sessionID || '', + // ⚠️ csrf-csrf v4 по умолчанию читает токен из заголовка x-csrf-token. + // Наши формы (EJS) отправляют его в теле POST как поле _csrf. + // Без этой строки токен не находится → 403 на каждый POST. + getCsrfTokenFromRequest: (req) => req.body && req.body._csrf, + + // Имя cookie без префикса __Host- (дефолт __Host-psifi.x-csrf-token + // требует Secure-флаг; при NODE_ENV≠production secure:false → cookie + // отклоняется браузером по HTTPS и валидация падает). + cookieName: 'csrf-token', + cookieOptions: { // secure: true → cookie передаётся только по HTTPS. Важно в продакшене. secure: process.env.NODE_ENV === 'production',