> Как защититься от SQL инъекции (JavaScript)
Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы
Компании: ESoft
Стек: Node.js, JavaScript, Java
> Пример ответа
Короткий ответ
SQL-инъекции предотвращаются использованием параметризованных запросов (prepared statements) вместо конкатенации строк. В Node.js это достигается через библиотеки вроде pg с placeholders ($1, $2), в Java - через PreparedStatement. Дополнительно применяется валидация и экранирование входных данных, а также ORM с безопасными query builder'ами. Никогда не доверяйте пользовательскому вводу.
Подробное объяснение
SQL-инъекция возникает, когда злоумышленник вставляет вредоносный SQL-код через входные данные (например, поля форм, URL-параметры). Если приложение конкатенирует строки напрямую, злоумышленник может изменить структуру запроса: SELECT * FROM users WHERE name = 'admin' OR '1'='1'.
Основные методы защиты:
-
Параметризованные запросы (prepared statements) - самый надёжный способ. SQL-шаблон компилируется заранее, а параметры передаются отдельно, что исключает интерпретацию ввода как кода. Это работает на уровне драйвера БД.
-
Экранирование входных данных - менее предпочтительно, так как легко ошибиться. Используется как дополнительная мера.
-
Валидация и санитизация - проверка типа данных (число, UUID, enum), длины, регулярные выражения. Например, для id используйте
Number(id)илиparseInt. -
ORM и query builder'ы (Sequelize, TypeORM, Prisma, Hibernate) - они по умолчанию используют параметризацию, но не защищают от ошибок в raw-запросах.
-
Принцип наименьших привилегий - у пользователя БД должны быть минимальные права (только SELECT, без DROP).
На практике
Для frontend-разработчика, работающего с Node.js и Java, защита от SQL-инъекций обычно реализуется на бэкенде. Однако важно понимать, что:
- В Node.js с
pgиспользуйтеclient.query('SELECT * FROM users WHERE id = $1', [userId]). - В Java с JDBC -
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?"); ps.setInt(1, userId);. - Избегайте raw-запросов в ORM (например,
sequelize.query('SELECT ...')без параметров). - Для динамических условий (IN, ORDER BY) используйте белые списки допустимых значений, а не подстановку строк.
- Валидируйте входные данные на клиенте, но не полагайтесь на это - всегда проверяйте на сервере.
Пример кода
Node.js с библиотекой pg (правильно):
JAVASCRIPTconst result = await pool.query('SELECT * FROM users WHERE email = $1 AND active = $2',[userInput.email, true]);
Node.js с pg (опасно):
JAVASCRIPTconst result = await pool.query(`SELECT * FROM users WHERE email = '${userInput.email}' AND active = true`);
Java с JDBC (правильно):
JAVAString sql = "SELECT * FROM users WHERE email = ? AND active = ?";PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1, userInput.getEmail());ps.setBoolean(2, true);ResultSet rs = ps.executeQuery();
Как отвечать на собеседовании
Начните с чёткого определения проблемы: SQL-инъекция - это внедрение вредоносного SQL-кода через пользовательский ввод. Затем сразу переходите к главному решению - параметризованным запросам. Упомяните, что это работает на уровне драйвера БД, а не на уровне приложения. Приведите пример на Node.js и Java. Добавьте про ORM и валидацию как дополнительный слой. Если спросят про динамические запросы (например, сортировка по столбцу), объясните про белые списки. Не углубляйтесь в экранирование - это legacy-подход.
Что проверяет интервьюер
- Понимание механизма инъекции (как именно злоумышленник может изменить запрос).
- Знание практических инструментов защиты (prepared statements, ORM).
- Умение различать безопасные и опасные паттерны в коде.
- Понимание, что защита должна быть на сервере, а не на клиенте.
- Осведомлённость о дополнительных мерах (валидация, привилегии).
Типичные ошибки
- Предложение экранирования как основного метода защиты (это ненадёжно).
- Уверенность, что ORM полностью защищает от инъекций (если использовать raw-запросы - нет).
- Игнорирование динамических запросов (например, сортировка через конкатенацию).
- Фокус только на клиентской валидации.
- Путаница между SQL-инъекцией и XSS (разные векторы атак).
> Похожие задачи по JavaScript
Какие подходы к оптимизации веб-приложений существуют
В чем разница между WHERE и HAVING в SQL и зачем использовать HAVING после GROUP BY?
Какой опыт работы с REST API и какими инструментами пользовалась
Что такое принципы SOLID и как они помогают писать структурированный код
> Похожие задачи по frontend
Какие подходы к оптимизации веб-приложений существуют
В чем разница между WHERE и HAVING в SQL и зачем использовать HAVING после GROUP BY?
Какой опыт работы с REST API и какими инструментами пользовалась
Что такое принципы SOLID и как они помогают писать структурированный код
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью