Что такое инъекция (Injection) как тип уязвимости в Java-приложениях?

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

Ответ

Инъекция (Injection) — это класс уязвимостей безопасности, при которых злоумышленник может внедрить и выполнить произвольный код или команды, передав специально сформированные данные в приложение. Уязвимость возникает из-за некорректной обработки и доверия к пользовательскому вводу.

Основные типы инъекций в Java:

  1. SQL-инъекция (SQL Injection):

    • Уязвимый код: Конкатенация пользовательского ввода в SQL-запрос.
      String query = "SELECT * FROM users WHERE login = '" + userInput + "'";
      Statement stmt = connection.createStatement();
      ResultSet rs = stmt.executeQuery(query); // Риск!
    • Защита: Всегда используйте параметризованные запросы (PreparedStatement).
      String query = "SELECT * FROM users WHERE login = ?";
      PreparedStatement stmt = connection.prepareStatement(query);
      stmt.setString(1, userInput); // Ввод безопасно подставляется как значение, а не как часть кода
      ResultSet rs = stmt.executeQuery();
  2. Инъекция команд ОС (Command Injection):

    • Уязвимый код: Передача пользовательского ввода в команды операционной системы.
      String command = "ping " + userInput;
      Runtime.getRuntime().exec(command); // Риск выполнения произвольных команд!
    • Защита: Строгая валидация ввода (белые списки разрешенных символов), избегание прямого вызова командной строки, использование безопасных API.
  3. Инъекция в выражения (Expression Language Injection, Script Injection):

    • Может возникать при динамической обработке выражений (например, в JSP EL, OGNL, SpEL).

Важно не путать с Dependency Injection (DI) — это архитектурный паттерн для управления зависимостями (например, в Spring), который не является уязвимостью, а наоборот, способствует созданию более тестируемого и гибкого кода.

Общие меры защиты:

  • Валидация и санитизация всех входящих данных.
  • Использование параметризованных запросов для работы с БД.
  • Принцип наименьших привилегий для доступа к БД и ОС.
  • Использование ORM-фреймворков (Hibernate, JPA), которые по умолчанию защищают от SQL-инъекций.