Что такое SQL-инъекция?

«Что такое SQL-инъекция?» — вопрос из категории Безопасность, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SQL-инъекция — это уязвимость безопасности, возникающая, когда некорректно обработанные пользовательские данные напрямую включаются в SQL-запрос. Это позволяет злоумышленнику выполнить произвольный вредоносный SQL-код в базе данных.

Почему это опасно:

  • Кража, изменение или удаление данных.
  • Обход аутентификации.
  • Выполнение административных операций на сервере БД.

Пример уязвимого кода (Java):

String username = request.getParameter("username");
String query = "SELECT * FROM users WHERE username = '" + username + "'";
// Если username = ' OR '1'='1, запрос станет:
// SELECT * FROM users WHERE username = '' OR '1'='1'
// и вернёт всех пользователей.

Основные методы защиты:

  1. Использование Prepared Statements (наиболее эффективно): Параметры передаются отдельно от запроса и автоматически экранируются.
    String sql = "SELECT * FROM users WHERE username = ?";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setString(1, username); // Безопасно
  2. Использование ORM (например, Hibernate, JPA) с именованными параметрами.
  3. Строгая валидация и санитизация ввода (белые списки допустимых символов).
  4. Принцип минимальных привилегий: Учётная запись приложения в БД должна иметь только необходимые права.