> Какие меры безопасности нужно учитывать при разработке приложений с большим количеством пользовательского контента и высоким риском атак (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-csrfmiddleware, установи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 middlewareapp.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: *).
> Похожие задачи по JavaScript
Применял ли ты архитектурные шаблоны в коде
Как ты пришел к руководству командой
В чем заключается принцип работы кластеров Node.js и как они помогают масштабированию приложения
Какие подходы и стратегии кэширования существуют в Node.js для улучшения производительности работы с базами данных
> Похожие задачи по frontend
В каком направлении хочешь развиваться
Как ты пришел к руководству командой
В чем заключается принцип работы кластеров Node.js и как они помогают масштабированию приложения
Что такое протокол HTTP и как он работает
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью