Ответ
Автоматизированное тестирование безопасности включает несколько взаимодополняющих подходов:
| Тип (Аббревиатура) | Что анализирует | Когда выполняется | Примеры инструментов |
|---|---|---|---|
| Статический анализ (SAST) | Исходный код, байт-код. | На этапе разработки ("слева" в CI/CD). | SonarQube, Checkmarx, Fortify, Semgrep. |
| Динамический анализ (DAST) | Работающее приложение через его интерфейсы. | На тестовом стенде или в production. | OWASP ZAP, Burp Suite, Acunetix. |
| Интерактивный анализ (IAST) | Код приложения во время его работы (инструментирование). | Во время тестов (DAST или ручных). | Contrast Security, Seeker. |
| Анализ зависимостей (SCA) | Сторонние библиотеки и компоненты. | На этапе сборки. | Snyk, WhiteSource, Dependency-Check. |
| Фаззинг (Fuzz Testing) | Приложение путем отправки невалидных/случайных данных. | В процессе тестирования. | AFL, libFuzzer, Jazzer. |
Почему нужна комбинация?
- SAST находит уязвимости в коде до запуска, но может давать ложные срабатывания.
- DAST находит реальные уязвимости в развернутом приложении, но не указывает на строку кода.
- SCA критически важен из-за повсеместного использования сторонних библиотек.
Пример уязвимости, которую найдет SAST (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();