Як захистити додаток Express.js?
Безпека в Express.js
Забезпечення безпеки API на базі Express.js вимагає комбінації пакетів та найкращих практик. Ось найважливіші рівні безпеки.
1. Helmet — HTTP заголовки безпеки
bash
npm install helmetjs
const helmet = require('helmet');
// Автоматично встановлює 11 заголовків HTTP, пов'язаних із безпекою
app.use(helmet());
// Що встановлює helmet:
// Content-Security-Policy
// X-Frame-Options: DENY
// X-Content-Type-Options: nosniff
// Strict-Transport-Security (HSTS)
// X-XSS-Protection
// Referrer-Policy
// ...і більше2. Обмеження швидкості
bash
npm install express-rate-limitjs
const rateLimit = require('express-rate-limit');
// Загальне обмеження швидкості API
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 хвилин
max: 100, // максимум 100 запитів за вікно
standardHeaders: true,
legacyHeaders: false,
message: { error: 'Занадто багато запитів, будь ласка, спробуйте ще раз пізніше' }
});
// Строже обмеження для маршрутів аутентифікації
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 5, // лише 5 спроб входу за 15 хвилин
skipSuccessfulRequests: true,
message: { error: 'Занадто багато спроб входу' }
});
app.use('/api/', apiLimiter);
app.use('/auth/login', authLimiter);
app.use('/auth/register', authLimiter);3. Санітизація вводу
bash
npm install express-mongo-sanitize xss-cleanjs
const mongoSanitize = require('express-mongo-sanitize');
const xss = require('xss-clean');
app.use(mongoSanitize()); // запобігає NoSQL ін'єкціям: $where, $gt
app.use(xss()); // видаляє HTML теги з вводу4. Обмеження розміру запитів
js
app.use(express.json({ limit: '10kb' })); // обмежити розмір JSON тіла
app.use(express.urlencoded({ limit: '10kb', extended: true }));5. HTTPS та HSTS
js
// Примусове перенаправлення на HTTPS у продакшені
app.use((req, res, next) => {
if (process.env.NODE_ENV === 'production' && !req.secure) {
return res.redirect(301, `https://${req.hostname}${req.url}`);
}
next();
});6. Змінні середовища
js
// ✅ Добре — секрети в середовищі
const JWT_SECRET = process.env.JWT_SECRET;
const DB_PASSWORD = process.env.DB_PASSWORD;
// ❌ Погано — секрети в коді
const JWT_SECRET = 'hardcoded-secret';7. Запобігання забрудненню параметрів
bash
npm install hppjs
const hpp = require('hpp');
app.use(hpp()); // запобігає: /api?sort=name&sort=price8. Сховати підпис Express
js
app.disable('x-powered-by');
// або використовуйте helmet(), який робить це автоматично
// Видаляє: X-Powered-By: Express заголовокКонтрольний список безпеки
| # | Пункт | Пакет |
|---|---|---|
| ✅ | HTTP заголовки безпеки | helmet |
| ✅ | Обмеження швидкості | express-rate-limit |
| ✅ | Налаштування CORS | cors |
| ✅ | Санітизація вводу | express-mongo-sanitize, xss-clean |
| ✅ | Обмеження розміру запитів | express.json({ limit }) |
| ✅ | JWT з коротким терміном дії | jsonwebtoken |
| ✅ | Хешування паролів | bcryptjs (12+ раундів) |
| ✅ | Примус HTTPS | nginx / middleware перенаправлення |
| ✅ | Сховати X-Powered-By | helmet |
| ✅ | Секрети в змінних середовища | dotenv |
Резюме
Безпека має багатошарову структуру: почніть з helmet та обмеження швидкості, перевіряйте та санітуйте всі ввідні дані, примушуйте HTTPS, використовуйте надійне хешування паролів і зберігайте секрети в змінних середовища. Ніколи не довіряйте даним з клієнта.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.