Помилки безпеки, які Node.js розробники випускають у продакшн
Минулого року я проводив рев'ю коду для одного стартапу. Код виглядав чистим. Тести проходили успішно.
Потім я побачив цей рядок:
const query = SELECT * FROM users WHERE email = '${req.body.email}'``
Це помилка SQL-ін'єкції. Стартап використовував це в продакшні протягом 8 місяців. Жоден розробник чи CTO її не помітив.
Ці помилки невидимі, тому що код працює. Він працює доти, доки користувач не введе шкідливу команду в поле введення.
Припиніть робити ці 5 поширених помилок:
- Сирий SQL із вводом користувача Не використовуйте шаблонні рядки (template literals) для запитів. Це дозволяє зловмисникам отримати доступ до вашої бази даних.
- Погано:
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
