Лучшие практики безопасности
Выпустите Node-сервис, который выдерживает атаки, реально встречающиеся в продакшене
- останавливать инъекции (SQL и команд ОС) параметризацией вместо склейки строк;
- предотвращать XSS, кодируя вывод и применяя Content-Security-Policy;
- держать секреты вне исходников, логов и ответов об ошибках;
- распознавать и блокировать загрязнение прототипа при слиянии объектов и разборе JSON;
- усиливать HTTP с помощью helmet, гасить злоупотребления ограничением частоты и проверять зависимости.
1. Эшелонированная защита: не доверяйте одной стене
Любой запрос из интернета — это недоверенный ввод, пока не доказано обратное. Надёжный сервис не полагается на одну проверку; он применяет перекрывающиеся меры, чтобы одна ошибка не стала взломом. Это эшелонированная защита: валидация на границе, безопасный доступ к данным в середине и минимальные привилегии везде.
Аналогия. Замок выживает не благодаря одной толстой двери. У него есть ров, внешняя стена, внутренняя стена и стража у донжона. Если атакующий проскользнул мимо одной преграды, следующая всё равно его остановит. Ваш ограничитель частоты, валидатор, параметризованный запрос и заголовки безопасности — это те концентрические стены.
На схеме ниже показан запрос, проходящий сквозь слои усиленного Express-приложения. Каждая полоса — независимая мера; полезная нагрузка должна победить все, чтобы причинить вред.
Держите в голове одно правило: никогда не принимайте решение о безопасности на основе данных, которыми клиент полностью управляет. Валидируйте их, экранируйте или привязывайте — но не склеивайте во что-то мощное.