Уязвимости безопасности, которые Node.js разработчики допускают в продакшене

В прошлом году я проводил ревью кода для одного стартапа. Код выглядел чистым. Тесты проходили.

Затем я увидел эту строку: const query = \SELECT * FROM users WHERE email = '${req.body.email}'``

Это баг SQL-инъекции. Стартап использовал это в продакшене в течение 8 месяцев. Ни разработчик, ни CTO этого не заметили.

Эти баги невидимы, потому что код работает. Он работает до тех пор, пока пользователь не введет вредоносную команду в поле ввода.

Прекратите совершать эти 5 распространенных ошибок:

  1. Сырой SQL с пользовательским вводом Не используйте шаблонные строки для запросов. Это позволяет злоумышленникам получить доступ к вашей базе данных.
  • Плохо: const query = \SELECT * FROM users WHERE email = '${email}'``
  • Хорошо: Используйте параметризованные запросы. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. Утечка секретов в Git Разработчики часто коммитят .env файлы в репозитории. Это раскрывает URL-адреса ваших баз данных и API-ключи. Всегда добавляйте .env в ваш файл .gitignore.

  2. Использование jwt.decode вместо jwt.verify jwt.decode только считывает токен. Он не проверяет, является ли токен подлинным. Любой может подделать декодированный токен.

  • Плохо: const user = jwt.decode(token)
  • Хорошо: Всегда проверяйте подпись. const user = jwt.verify(token, process.env.JWT_SECRET)
  1. Отсутствие ограничения частоты запросов (rate limiting) на эндпоинтах аутентификации Без ограничения частоты запросов злоумышленники могут перебирать миллионы паролей методом brute force. Используйте библиотеку для ограничения попыток входа.
  • Хорошо: Установите лимит в 10 попыток на 15 минут.
  1. Избыточные сообщения об ошибках Отправка необработанных сообщений об ошибках клиенту помогает злоумышленникам изучить вашу систему. Они видят названия ваших таблиц и типы баз данных.
  • Плохо: 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