> Какие меры безопасности нужно учитывать при разработке приложений с большим количеством пользовательского контента и высоким риском атак (JavaScript)

Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: ESoft

Стек: Node.js, JavaScript

> Пример ответа

Короткий ответ

При разработке приложений с пользовательским контентом критичны: санитизация и экранирование ввода (XSS), защита от CSRF, ограничение размера и типа загружаемых файлов, rate limiting, Content Security Policy (CSP), валидация на сервере, защита от SQL-инъекций через ORM, безопасное хранение токенов и использование HTTPS. На фронтенде - экранирование при рендеринге, избегание dangerouslySetInnerHTML, проверка origin для iframe и postMessage.

Подробное объяснение

Основные угрозы для приложений с UGC: XSS (внедрение скриптов через контент), CSRF (подделка запросов), загрузка вредоносных файлов, инъекции (SQL, NoSQL), атаки на аутентификацию (session hijacking, token theft) и DDoS через пользовательские запросы. На фронтенде XSS - главная опасность: пользовательский контент может содержать HTML/JS, который выполнится в браузере других пользователей. CSP блокирует неавторизованные скрипты, но не заменяет экранирование. CSRF предотвращается SameSite cookies и CSRF-токенами. Загрузка файлов требует проверки MIME-типа, размера, антивирусного сканирования и хранения вне webroot. Rate limiting защищает от abuse API. Всегда валидируй и санитизируй данные на сервере - клиентская проверка ненадёжна.

На практике

  • Используй библиотеки для санитизации: DOMPurify на клиенте, sanitize-html на сервере (Node.js).
  • Для CSP настрой политику через HTTP-заголовок: Content-Security-Policy: default-src 'self'; script-src 'self'.
  • CSRF-защита: в Express используй csurf или csrf-csrf middleware, установи SameSite=Strict для cookies.
  • Загрузка файлов: multer с лимитами, проверка через file-type (не доверяй расширению), хранение в облаке (S3) с подписанными URL.
  • Rate limiting: express-rate-limit для API, дополнительные лимиты на загрузку контента.
  • Аутентификация: httpOnly cookies для refresh token, short-lived access token в памяти, защита от XSS через CSP.
  • Для postMessage проверяй event.origin и валидируй сообщения.

Пример кода

JAVASCRIPT
// Серверная санитизация контента (Node.js)
const sanitizeHtml = require('sanitize-html');
app.post('/api/content', (req, res) => {
const cleanContent = sanitizeHtml(req.body.content, {
allowedTags: ['b', 'i', 'em', 'strong', 'a'],
allowedAttributes: { 'a': ['href'] },
allowedSchemes: ['http', 'https']
});
// Сохраняем cleanContent в БД
});
// CSP middleware
app.use((req, res, next) => {
res.setHeader('Content-Security-Policy',
"default-src 'self'; script-src 'self' 'nonce-abc123'; style-src 'self' 'unsafe-inline'");
next();
});
// Rate limiting для загрузки контента
const rateLimit = require('express-rate-limit');
const contentLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 10,
message: 'Слишком много запросов, попробуйте позже'
});
app.post('/api/content', contentLimiter, handler);

Как отвечать на собеседовании

Начни с перечисления основных угроз (XSS, CSRF, file upload, injection), затем уточни, что на фронтенде главное - экранирование и CSP, на бэкенде - валидация и санитизация. Приведи конкретные инструменты (DOMPurify, CSP, csurf). Покажи понимание trade-off: CSP может сломать легитимные скрипты, rate limiting - затронуть честных пользователей. Упомяни, что безопасность - layered approach, ни одна мера не достаточна. Если спросят про Node.js, расскажи про helmet, express-rate-limit, sanitize-html. Избегай абстрактных ответов - давай примеры кода.

Что проверяет интервьюер

  • Понимание OWASP Top 10 применительно к UGC.
  • Умение различать клиентскую и серверную защиту.
  • Знание конкретных библиотек и практик в Node.js/JavaScript.
  • Способность объяснить trade-off (безопасность vs производительность/UX).
  • Опыт с CSP, CSRF, file upload security.

Типичные ошибки

  • Надежда только на клиентскую валидацию - злоумышленник отправляет запрос напрямую.
  • Использование dangerouslySetInnerHTML без санитизации.
  • Игнорирование CSP: "у нас всё экранируется".
  • Доверие расширению файла вместо проверки содержимого.
  • Отсутствие rate limiting на критических эндпоинтах (загрузка контента, логин).
  • Хранение загруженных файлов в public директории без контроля доступа.
  • Неправильная настройка CORS (Access-Control-Allow-Origin: *).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью