Ответ
Инъекция (Injection) — это класс уязвимостей безопасности, при которых злоумышленник может внедрить и выполнить произвольный код или команды, передав специально сформированные данные в приложение. Уязвимость возникает из-за некорректной обработки и доверия к пользовательскому вводу.
Основные типы инъекций в Java:
-
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();
- Уязвимый код: Конкатенация пользовательского ввода в SQL-запрос.
-
Инъекция команд ОС (Command Injection):
- Уязвимый код: Передача пользовательского ввода в команды операционной системы.
String command = "ping " + userInput; Runtime.getRuntime().exec(command); // Риск выполнения произвольных команд! - Защита: Строгая валидация ввода (белые списки разрешенных символов), избегание прямого вызова командной строки, использование безопасных API.
- Уязвимый код: Передача пользовательского ввода в команды операционной системы.
-
Инъекция в выражения (Expression Language Injection, Script Injection):
- Может возникать при динамической обработке выражений (например, в JSP EL, OGNL, SpEL).
Важно не путать с Dependency Injection (DI) — это архитектурный паттерн для управления зависимостями (например, в Spring), который не является уязвимостью, а наоборот, способствует созданию более тестируемого и гибкого кода.
Общие меры защиты:
- Валидация и санитизация всех входящих данных.
- Использование параметризованных запросов для работы с БД.
- Принцип наименьших привилегий для доступа к БД и ОС.
- Использование ORM-фреймворков (Hibernate, JPA), которые по умолчанию защищают от SQL-инъекций.