Какие меры безопасности нужно учитывать при разработке приложений с большим количеством пользовательского контента и высоким риском атак
Что проверяют
Умеете ли вы смотреть на пользовательский ввод как на атаку и знаете ли слабые места именно Node.js. Следом обычно просят провести загрузку файла или комментарий с HTML от ввода до показа на странице.
Как отвечать
Идите по пути данных, от входа к выводу:
- валидация на сервере: схема на каждый эндпоинт через
zodилиajv, лимит тела запроса (уexpress.jsonпо умолчанию 100 КБ). Проверка на клиенте это удобство, а не защита; - XSS: экранирование по контексту вывода, для разрешённого HTML санитайзер со списком допустимых тегов (
DOMPurifyчерезjsdomилиsanitize-html), сырой HTML в Markdown отключён. Поверх этого CSP сnonceи заголовки черезhelmet; - файлы: тип определять по сигнатуре содержимого, а не по расширению, картинки перекодировать через
sharp(заодно уходит EXIF), отдавать с отдельного домена сX-Content-Type-Options: nosniff. SVG это документ со скриптами, его чистят или отдают только на скачивание; - инъекции: параметризованные запросы в SQL, в MongoDB проверка, что в поле пришла строка, а не объект вроде
{"$ne": null}. Плюс prototype pollution через ключ__proto__при глубоком слиянии JSON; - SSRF: превью ссылок и загрузка по URL не должны ходить во внутреннюю сеть, адрес проверяют после резолва DNS и на каждом редиректе;
- доступ: проверка владельца на каждый объект, иначе IDOR. Cookie с
HttpOnly,Secure,SameSite, CSRF-токен на изменяющих запросах; - злоупотребления: rate limiting по пользователю и IP, капча и антиспам на публикации;
- зависимости: lock-файл,
npm ci,npm auditв CI.
Где спотыкаются
Забывают, что Node однопоточный. Регулярка с катастрофическим перебором (ReDoS) или разбор огромного JSON блокирует event loop, и встаёт весь сервис, а не один запрос.
Чистят HTML своими регулярками или чёрным списком тегов. Обходов десятки, нужен проверенный санитайзер со списком разрешённого.
Доверяют расширению и Content-Type загруженного файла и отдают его с основного домена. Тогда HTML или SVG с чужим скриптом выполняется в контексте вашего сайта.