initial commit
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
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',
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user