Уязвимости безопасности, которые Node.js разработчики допускают в продакшене
В прошлом году я проводил ревью кода для одного стартапа. Код выглядел чистым. Тесты проходили.
Затем я увидел эту строку:
const query = \SELECT * FROM users WHERE email = '${req.body.email}'``
Это баг SQL-инъекции. Стартап использовал это в продакшене в течение 8 месяцев. Ни разработчик, ни CTO этого не заметили.
Эти баги невидимы, потому что код работает. Он работает до тех пор, пока пользователь не введет вредоносную команду в поле ввода.
Прекратите совершать эти 5 распространенных ошибок:
- Сырой SQL с пользовательским вводом Не используйте шаблонные строки для запросов. Это позволяет злоумышленникам получить доступ к вашей базе данных.
- Плохо:
const query = \SELECT * FROM users WHERE email = '${email}'`` - Хорошо: Используйте параметризованные запросы.
const query = 'SELECT * FROM users WHERE email = $1'db.query(query, [email])
Утечка секретов в Git Разработчики часто коммитят .env файлы в репозитории. Это раскрывает URL-адреса ваших баз данных и API-ключи. Всегда добавляйте .env в ваш файл .gitignore.
Использование jwt.decode вместо jwt.verify jwt.decode только считывает токен. Он не проверяет, является ли токен подлинным. Любой может подделать декодированный токен.
- Плохо:
const user = jwt.decode(token) - Хорошо: Всегда проверяйте подпись.
const user = jwt.verify(token, process.env.JWT_SECRET)
- Отсутствие ограничения частоты запросов (rate limiting) на эндпоинтах аутентификации Без ограничения частоты запросов злоумышленники могут перебирать миллионы паролей методом brute force. Используйте библиотеку для ограничения попыток входа.
- Хорошо: Установите лимит в 10 попыток на 15 минут.
- Избыточные сообщения об ошибках Отправка необработанных сообщений об ошибках клиенту помогает злоумышленникам изучить вашу систему. Они видят названия ваших таблиц и типы баз данных.
- Плохо:
res.status(500).json({ error: error.message }) - Хорошо: Логируйте ошибку внутри системы. Отправляйте пользователю общее сообщение.
res.status(500).json({ error: 'Something went wrong' })
Прежде чем выпускать эндпоинт, задайте себе один вопрос: Что произойдет, если пользователь отправит неожиданные данные?
Уязвимости безопасности редко бывают сложными. Они возникают, когда вы забываете думать о злоумышленниках.
Какую уязвимость безопасности вы находили в продакшене?
Источник: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6
