28 lines
1.1 KiB
JavaScript
28 lines
1.1 KiB
JavaScript
import { env } from '../config/env.js';
|
||
|
||
export function csrfRequired(req, res, next) {
|
||
const cookieToken = req.cookies?.[env.COOKIE_CSRF_NAME];
|
||
const headerToken = req.get('x-csrf-token');
|
||
|
||
// Для SameSite cookie защита уже встроена в браузер
|
||
// Если cookie есть и SameSite установлен - это уже защита от CSRF
|
||
// Дополнительная проверка заголовка для обратной совместимости
|
||
if (cookieToken) {
|
||
// Cookie с SameSite=Lax/Strict уже защищает от CSRF
|
||
// Если заголовок есть - проверяем совпадение (double submit pattern)
|
||
if (headerToken && cookieToken !== headerToken) {
|
||
return res.status(403).json({
|
||
error: 'CSRF_INVALID',
|
||
message: 'CSRF token mismatch',
|
||
});
|
||
}
|
||
// Если заголовка нет - разрешаем (SameSite cookie защищает)
|
||
return next();
|
||
}
|
||
|
||
// Cookie нет - это ошибка
|
||
return res.status(403).json({
|
||
error: 'CSRF_INVALID',
|
||
message: 'CSRF token is missing',
|
||
});
|
||
} |