Панель управления
-Сервис:
- - + +Синхронизация заявок
+Получение актуальных данных из внешней системы бронирования
+ + ++
Администраторы
+ +| ID | +Логин | +Действия | +
|---|
Управление администраторами
-| ID | Логин | Действия |
|---|
diff --git a/auth.js b/auth.js index 42b4702..39c5438 100644 --- a/auth.js +++ b/auth.js @@ -1,10 +1,10 @@ const session = require('express-session'); const SQLiteStore = require('connect-sqlite3')(session); const bcrypt = require('bcrypt'); +const crypto = require('crypto'); const { db } = require('./db'); const path = require('path'); -// Директория для файла с сессиями (пусть будет data/) const sessionDbPath = path.join(__dirname, 'data', 'sessions.sqlite'); const sessionMiddleware = session({ @@ -12,21 +12,39 @@ const sessionMiddleware = session({ resave: false, saveUninitialized: false, cookie: { - secure: false, // для HTTPS нужно true, но у нас http + secure: false, httpOnly: true, - maxAge: 24 * 60 * 60 * 1000 // 24 часа + sameSite: 'lax', + maxAge: 24 * 6 * 60 * 1000 }, store: new SQLiteStore({ - db: 'sessions.sqlite', // имя файла в директории data + db: 'sessions.sqlite', dir: path.join(__dirname, 'data'), - table: 'sessions' // имя таблицы + table: 'sessions' }) }); -/** - * Гарантирует существование администратора, заданного переменными окружения - * (ADMIN_LOGIN / ADMIN_PASSWORD). Пароль всегда хэшируется. - */ +function generateCsrfToken(req) { + if (!req.session.csrfToken) { + req.session.csrfToken = crypto.randomBytes(32).toString('hex'); + } + return req.session.csrfToken; +} + +function csrfProtection(req, res, next) { + if (req.method === 'GET') return next(); + const token = req.headers['x-csrf-token'] || req.body._csrf; + if (!token || token !== req.session.csrfToken) { + return res.status(403).json({ error: 'CSRF token validation failed' }); + } + next(); +} + +function injectCsrfToken(req, res, next) { + res.locals.csrfToken = generateCsrfToken(req); + next(); +} + async function ensureAdmin() { const login = process.env.ADMIN_LOGIN || 'admin'; const password = process.env.ADMIN_PASSWORD || 'admin'; @@ -44,9 +62,6 @@ async function ensureAdmin() { } } -/** - * Middleware для проверки прав администратора. - */ function requireAdmin(req, res, next) { if (req.session && req.session.isAdmin) { return next(); @@ -54,4 +69,4 @@ function requireAdmin(req, res, next) { res.status(401).json({ error: 'Не авторизован' }); } -module.exports = { sessionMiddleware, ensureAdmin, requireAdmin }; \ No newline at end of file +module.exports = { sessionMiddleware, csrfProtection, injectCsrfToken, ensureAdmin, requireAdmin }; \ No newline at end of file diff --git a/public/admin.html b/public/admin.html index 970d653..f9860f2 100644 --- a/public/admin.html +++ b/public/admin.html @@ -4,128 +4,249 @@ +
Сервис:
- - + +Получение актуальных данных из внешней системы бронирования
+ + +| ID | +Логин | +Действия | +
|---|
| ID | Логин | Действия |
|---|