\n}\n\n// ✅ Правильно (Escaping/Encoding)\npublic String search(@RequestParam String query) {\n String safe = HtmlUtils.htmlEscape(query);\n return \"

Results for \" + safe + \"

\";\n}\n\n// ❌ Insecure Deserialization\nObjectInputStream ois = new ObjectInputStream(inputStream);\nObject obj = ois.readObject(); // Опасно!\n\n// ✅ Правильно\n// Используй JSON вместо Java serialization\n// Или используй List> allowedClasses = ...\n```\n\n**OWASP Top 10 основные уязвимости:**\n1. Injection attacks (SQL, NoSQL, Command Injection)\n2. Broken Authentication\n3. Sensitive Data Exposure\n4. XML External Entities (XXE)\n5. Broken Access Control\n6. Security Misconfiguration\n7. Cross-Site Scripting (XSS)\n8. Insecure Deserialization\n9. Using Components with Known Vulnerabilities\n10. Insufficient Logging & Monitoring\n\n### 2. Проверка аутентификации и авторизации\n\n**Задача:** Убедиться, что только авторизованные пользователи получают доступ к ресурсам\n\n```java\n// Unit тест для проверки доступа\n@Test\npublic void testUnauthorizedUserCannotAccessAdminPanel() {\n User regularUser = createUser(\"user@example.com\", \"USER\");\n \n assertThrows(AccessDeniedException.class, () -> {\n adminService.deleteUser(regularUser, targetUser);\n });\n}\n\n// Integration тест\n@Test\npublic void testJWTTokenValidation() {\n String invalidToken = \"invalid.token.here\";\n \n mockMvc.perform(get(\"/api/protected\")\n .header(\"Authorization\", \"Bearer \" + invalidToken))\n .andExpect(status().isUnauthorized());\n}\n\n// Spring Security config\n@Configuration\n@EnableWebSecurity\npublic class SecurityConfig {\n @Bean\n public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n http\n .authorizeRequests()\n .antMatchers(\"/public/**\").permitAll()\n .antMatchers(\"/admin/**\").hasRole(\"ADMIN\")\n .anyRequest().authenticated()\n .and()\n .formLogin()\n .and()\n .logout();\n return http.build();\n }\n}\n```\n\n**Проверяемые элементы:**\n- Сильные пароли (минимум 12 символов, сложность)\n- Защита от brute force (rate limiting)\n- Двухфакторная аутентификация\n- Session management (timeout, regeneration)\n- Role-Based Access Control (RBAC)\n\n### 3. Тестирование обработки входных данных\n\n**Задача:** Убедиться, что приложение правильно валидирует и обрабатывает входные данные\n\n```java\n// ❌ Опасно\n@PostMapping(\"/api/users\")\npublic User createUser(@RequestBody Map data) {\n User user = new User();\n user.setAdmin((Boolean) data.get(\"isAdmin\")); // Хакер может установить себе admin!\n return userRepository.save(user);\n}\n\n// ✅ Правильно\n@PostMapping(\"/api/users\")\npublic User createUser(@RequestBody @Valid CreateUserRequest request) {\n User user = new User();\n user.setEmail(request.getEmail());\n user.setName(request.getName());\n user.setRole(\"USER\"); // Роль всегда присваивается серверной логикой\n return userRepository.save(user);\n}\n\n@Data\nclass CreateUserRequest {\n @NotNull\n @Email\n private String email;\n \n @NotNull\n @Size(min = 3, max = 100)\n private String name;\n}\n\n// Тест валидации\n@Test\npublic void testInvalidEmailIsRejected() {\n CreateUserRequest request = new CreateUserRequest();\n request.setEmail(\"not-an-email\");\n request.setName(\"Test\");\n \n Set> violations = \n validator.validate(request);\n \n assertFalse(violations.isEmpty());\n}\n```\n\n**Типы проверок входных данных:**\n- Валидация формата (email, phone, credit card)\n- Проверка граничных значений\n- Проверка размера (buffer overflow prevention)\n- Санитизация (удаление опасных символов)\n- Whitelist валидация (разрешить только известные значения)\n\n### 4. Защита чувствительных данных\n\n**Задача:** Убедиться, что пароли, токены и ПДн не утекают\n\n```java\n// ❌ Опасно — пароль в логах\nlogger.info(\"User login: \" + username + \" with password: \" + password);\n\n// ✅ Правильно\nlogger.info(\"User login: \" + username);\n\n// ❌ Опасно — plain text пароль\npublic boolean validatePassword(String inputPassword, String storedPassword) {\n return inputPassword.equals(storedPassword);\n}\n\n// ✅ Правильно — bcrypt\n@Bean\npublic PasswordEncoder passwordEncoder() {\n return new BCryptPasswordEncoder();\n}\n\npublic boolean validatePassword(String inputPassword, String hashedPassword) {\n return passwordEncoder().matches(inputPassword, hashedPassword);\n}\n\n// Тест\n@Test\npublic void testPasswordIsHashed() {\n String rawPassword = \"MySecurePassword123\";\n String hashedPassword = passwordEncoder().encode(rawPassword);\n \n assertTrue(passwordEncoder().matches(rawPassword, hashedPassword));\n assertNotEquals(rawPassword, hashedPassword);\n}\n```\n\n**Инструменты для проверки утечек:**\n- Сканирование логов на чувствительные данные\n- Проверка .git истории (git-secrets)\n- DAST сканеры для выявления утечек в HTTP ответах\n- Проверка кэширования (Cache-Control headers)\n\n### 5. Тестирование управления сессиями\n\n**Задача:** Проверить, что сессии безопасны и не могут быть перехвачены\n\n```java\n// Тест: Session Fixation Attack\n@Test\npublic void testSessionRegenerationAfterLogin() {\n String sessionBeforeLogin = getSessionId();\n \n login(\"user\", \"password\");\n \n String sessionAfterLogin = getSessionId();\n \n // Session должен измениться после аутентификации\n assertNotEquals(sessionBeforeLogin, sessionAfterLogin);\n}\n\n// Конфиг защиты от session fixation\n@Configuration\n@EnableWebSecurity\npublic class SessionSecurityConfig {\n @Bean\n public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n http.sessionManagement()\n .sessionFixationProtection(SessionFixationProtectionStrategy.MIGRATE_SESSION)\n .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)\n .sessionConcurrency(c -> c.maximumSessions(1));\n return http.build();\n }\n}\n```\n\n**Проверяемые элементы:**\n- HttpOnly и Secure флаги на cookies\n- Timeout сессии\n- Logout удаляет сессию\n- Защита от Session Fixation\n- Защита от CSRF (Cross-Site Request Forgery)\n\n### 6. Тестирование криптографии\n\n**Задача:** Убедиться, что шифрование правильно реализовано\n\n```java\n// ❌ Опасно — слабый алгоритм\nMessageDigest md = MessageDigest.getInstance(\"MD5\");\n\n// ✅ Правильно\nMessageDigest md = MessageDigest.getInstance(\"SHA-256\");\n\n// ❌ Опасно — фиксированная соль\nString hash = bcrypt.hash(password, \"fixedSalt\");\n\n// ✅ Правильно — случайная соль\nString hash = bcrypt.hash(password); // Соль генерируется автоматически\n\n// Тест\n@Test\npublic void testDifferentHashesForSamePassword() {\n String password = \"MyPassword123\";\n String hash1 = passwordEncoder().encode(password);\n String hash2 = passwordEncoder().encode(password);\n \n assertNotEquals(hash1, hash2); // Разные хеши даже для одного пароля\n assertTrue(passwordEncoder().matches(password, hash1));\n assertTrue(passwordEncoder().matches(password, hash2));\n}\n```\n\n**Проверяемые элементы:**\n- Используются стандартные алгоритмы (AES-256, SHA-256, bcrypt)\n- Не используются deprecated алгоритмы (DES, MD5)\n- Правильная длина ключей (минимум 256 бит)\n- IV (Initialization Vector) уникальный для каждого шифрования\n\n### 7. Динамический анализ безопасности (DAST)\n\n**Задача:** Тестирование работающего приложения на уязвимости\n\n```java\n// OWASP ZAP через Maven\n\n org.zaproxy\n zaproxy-maven-plugin\n 2.12.0\n \n /path/to/zap\n \n\n\n// Или OWASP Dependency Check\n\n org.owasp\n dependency-check-maven\n 8.4.0\n\n```\n\n### 8. Тестирование управления ошибками\n\n**Задача:** Ошибки не должны раскрывать внутреннюю архитектуру\n\n```java\n// ❌ Опасно — раскрывает stack trace\n@ExceptionHandler(Exception.class)\npublic ResponseEntity handleException(Exception e) {\n return ResponseEntity.status(500).body(e.toString()); // Stack trace видна!\n}\n\n// ✅ Правильно\n@ExceptionHandler(Exception.class)\npublic ResponseEntity handleException(Exception e) {\n logger.error(\"Internal server error\", e); // Log на сервере\n return ResponseEntity.status(500).body(\n new ErrorResponse(\"Internal server error\", \"ERR_INTERNAL\")\n );\n}\n```\n\n### Инструменты для Security Testing\n\n| Инструмент | Назначение | Тип |\n|-----------|-----------|-----|\n| OWASP ZAP | Dynamic security scanning | DAST |\n| SonarQube | Code quality & security | SAST |\n| Burp Suite | Web app testing | DAST |\n| Checkmarx | Static analysis | SAST |\n| Dependency-Check | Vulnerable dependencies | SAST |\n| JUnit + Mockito | Unit security tests | Unit |\n\n### На собеседовании\n\nПокажи понимание:\n\n1. **OWASP Top 10** — основные типы уязвимостей\n2. **Валидация входных данных** — первая линия защиты\n3. **Аутентификация и авторизация** — правильная реализация\n4. **Управление чувствительными данными** — шифрование, хеширование\n5. **Практические примеры** — code examples проблем и решений\n6. **Инструменты** — какие инструменты используешь для тестирования\n7. **Continuous Security** — как интегрировать тестирование в CI/CD\n\nЭто покажет зрелый подход к разработке и понимание того, что security — это не отдельный feature, а часть каждой строки кода.\n","dateCreated":"2026-03-22T20:40:59.331064","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Какие ключевые задачи решает тестирование безопасности

2.0 Middle🔥 141 комментариев
#Безопасность#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ключевые задачи тестирования безопасности

Тестирование безопасности (Security Testing) — критический компонент SDLC, который выявляет уязвимости до попадания в production. Это не просто поиск ошибок, а стратегический процесс защиты приложения.

Основные задачи Security Testing

1. Выявление уязвимостей (Vulnerability Discovery)

Задача: Найти недостатки, которые может эксплуатировать злоумышленник

Типовые уязвимости:

// ❌ SQL Injection
public User findUser(String userId) {
    String query = "SELECT * FROM users WHERE id = " + userId;
    return repository.executeRaw(query);
    // Хакер вводит: 1; DROP TABLE users; --
}

// ✅ Правильно
public User findUser(String userId) {
    return repository.findById(userId);
    // Параметризованный запрос защищен автоматически
}

// ❌ XSS (Cross-Site Scripting)
@GetMapping("/search")
public String search(@RequestParam String query) {
    return "<h1>Results for " + query + "</h1>";
    // Хакер вводит: <script>alert('hacked')</script>
}

// ✅ Правильно (Escaping/Encoding)
public String search(@RequestParam String query) {
    String safe = HtmlUtils.htmlEscape(query);
    return "<h1>Results for " + safe + "</h1>";
}

// ❌ Insecure Deserialization
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject();  // Опасно!

// ✅ Правильно
// Используй JSON вместо Java serialization
// Или используй List<Class<?>> allowedClasses = ...

OWASP Top 10 основные уязвимости:

  1. Injection attacks (SQL, NoSQL, Command Injection)
  2. Broken Authentication
  3. Sensitive Data Exposure
  4. XML External Entities (XXE)
  5. Broken Access Control
  6. Security Misconfiguration
  7. Cross-Site Scripting (XSS)
  8. Insecure Deserialization
  9. Using Components with Known Vulnerabilities
  10. Insufficient Logging & Monitoring

2. Проверка аутентификации и авторизации

Задача: Убедиться, что только авторизованные пользователи получают доступ к ресурсам

// Unit тест для проверки доступа
@Test
public void testUnauthorizedUserCannotAccessAdminPanel() {
    User regularUser = createUser("user@example.com", "USER");
    
    assertThrows(AccessDeniedException.class, () -> {
        adminService.deleteUser(regularUser, targetUser);
    });
}

// Integration тест
@Test
public void testJWTTokenValidation() {
    String invalidToken = "invalid.token.here";
    
    mockMvc.perform(get("/api/protected")
            .header("Authorization", "Bearer " + invalidToken))
        .andExpect(status().isUnauthorized());
}

// Spring Security config
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .logout();
        return http.build();
    }
}

Проверяемые элементы:

  • Сильные пароли (минимум 12 символов, сложность)
  • Защита от brute force (rate limiting)
  • Двухфакторная аутентификация
  • Session management (timeout, regeneration)
  • Role-Based Access Control (RBAC)

3. Тестирование обработки входных данных

Задача: Убедиться, что приложение правильно валидирует и обрабатывает входные данные

// ❌ Опасно
@PostMapping("/api/users")
public User createUser(@RequestBody Map<String, Object> data) {
    User user = new User();
    user.setAdmin((Boolean) data.get("isAdmin"));  // Хакер может установить себе admin!
    return userRepository.save(user);
}

// ✅ Правильно
@PostMapping("/api/users")
public User createUser(@RequestBody @Valid CreateUserRequest request) {
    User user = new User();
    user.setEmail(request.getEmail());
    user.setName(request.getName());
    user.setRole("USER");  // Роль всегда присваивается серверной логикой
    return userRepository.save(user);
}

@Data
class CreateUserRequest {
    @NotNull
    @Email
    private String email;
    
    @NotNull
    @Size(min = 3, max = 100)
    private String name;
}

// Тест валидации
@Test
public void testInvalidEmailIsRejected() {
    CreateUserRequest request = new CreateUserRequest();
    request.setEmail("not-an-email");
    request.setName("Test");
    
    Set<ConstraintViolation<CreateUserRequest>> violations = 
        validator.validate(request);
    
    assertFalse(violations.isEmpty());
}

Типы проверок входных данных:

  • Валидация формата (email, phone, credit card)
  • Проверка граничных значений
  • Проверка размера (buffer overflow prevention)
  • Санитизация (удаление опасных символов)
  • Whitelist валидация (разрешить только известные значения)

4. Защита чувствительных данных

Задача: Убедиться, что пароли, токены и ПДн не утекают

// ❌ Опасно — пароль в логах
logger.info("User login: " + username + " with password: " + password);

// ✅ Правильно
logger.info("User login: " + username);

// ❌ Опасно — plain text пароль
public boolean validatePassword(String inputPassword, String storedPassword) {
    return inputPassword.equals(storedPassword);
}

// ✅ Правильно — bcrypt
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

public boolean validatePassword(String inputPassword, String hashedPassword) {
    return passwordEncoder().matches(inputPassword, hashedPassword);
}

// Тест
@Test
public void testPasswordIsHashed() {
    String rawPassword = "MySecurePassword123";
    String hashedPassword = passwordEncoder().encode(rawPassword);
    
    assertTrue(passwordEncoder().matches(rawPassword, hashedPassword));
    assertNotEquals(rawPassword, hashedPassword);
}

Инструменты для проверки утечек:

  • Сканирование логов на чувствительные данные
  • Проверка .git истории (git-secrets)
  • DAST сканеры для выявления утечек в HTTP ответах
  • Проверка кэширования (Cache-Control headers)

5. Тестирование управления сессиями

Задача: Проверить, что сессии безопасны и не могут быть перехвачены

// Тест: Session Fixation Attack
@Test
public void testSessionRegenerationAfterLogin() {
    String sessionBeforeLogin = getSessionId();
    
    login("user", "password");
    
    String sessionAfterLogin = getSessionId();
    
    // Session должен измениться после аутентификации
    assertNotEquals(sessionBeforeLogin, sessionAfterLogin);
}

// Конфиг защиты от session fixation
@Configuration
@EnableWebSecurity
public class SessionSecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.sessionManagement()
            .sessionFixationProtection(SessionFixationProtectionStrategy.MIGRATE_SESSION)
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
            .sessionConcurrency(c -> c.maximumSessions(1));
        return http.build();
    }
}

Проверяемые элементы:

  • HttpOnly и Secure флаги на cookies
  • Timeout сессии
  • Logout удаляет сессию
  • Защита от Session Fixation
  • Защита от CSRF (Cross-Site Request Forgery)

6. Тестирование криптографии

Задача: Убедиться, что шифрование правильно реализовано

// ❌ Опасно — слабый алгоритм
MessageDigest md = MessageDigest.getInstance("MD5");

// ✅ Правильно
MessageDigest md = MessageDigest.getInstance("SHA-256");

// ❌ Опасно — фиксированная соль
String hash = bcrypt.hash(password, "fixedSalt");

// ✅ Правильно — случайная соль
String hash = bcrypt.hash(password);  // Соль генерируется автоматически

// Тест
@Test
public void testDifferentHashesForSamePassword() {
    String password = "MyPassword123";
    String hash1 = passwordEncoder().encode(password);
    String hash2 = passwordEncoder().encode(password);
    
    assertNotEquals(hash1, hash2);  // Разные хеши даже для одного пароля
    assertTrue(passwordEncoder().matches(password, hash1));
    assertTrue(passwordEncoder().matches(password, hash2));
}

Проверяемые элементы:

  • Используются стандартные алгоритмы (AES-256, SHA-256, bcrypt)
  • Не используются deprecated алгоритмы (DES, MD5)
  • Правильная длина ключей (минимум 256 бит)
  • IV (Initialization Vector) уникальный для каждого шифрования

7. Динамический анализ безопасности (DAST)

Задача: Тестирование работающего приложения на уязвимости

// OWASP ZAP через Maven
<plugin>
    <groupId>org.zaproxy</groupId>
    <artifactId>zaproxy-maven-plugin</artifactId>
    <version>2.12.0</version>
    <configuration>
        <zapHomeDirectory>/path/to/zap</zapHomeDirectory>
    </configuration>
</plugin>

// Или OWASP Dependency Check
<plugin>
    <groupId>org.owasp</groupId>
    <artifactId>dependency-check-maven</artifactId>
    <version>8.4.0</version>
</plugin>

8. Тестирование управления ошибками

Задача: Ошибки не должны раскрывать внутреннюю архитектуру

// ❌ Опасно — раскрывает stack trace
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleException(Exception e) {
    return ResponseEntity.status(500).body(e.toString());  // Stack trace видна!
}

// ✅ Правильно
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleException(Exception e) {
    logger.error("Internal server error", e);  // Log на сервере
    return ResponseEntity.status(500).body(
        new ErrorResponse("Internal server error", "ERR_INTERNAL")
    );
}

Инструменты для Security Testing

ИнструментНазначениеТип
OWASP ZAPDynamic security scanningDAST
SonarQubeCode quality & securitySAST
Burp SuiteWeb app testingDAST
CheckmarxStatic analysisSAST
Dependency-CheckVulnerable dependenciesSAST
JUnit + MockitoUnit security testsUnit

На собеседовании

Покажи понимание:

  1. OWASP Top 10 — основные типы уязвимостей
  2. Валидация входных данных — первая линия защиты
  3. Аутентификация и авторизация — правильная реализация
  4. Управление чувствительными данными — шифрование, хеширование
  5. Практические примеры — code examples проблем и решений
  6. Инструменты — какие инструменты используешь для тестирования
  7. Continuous Security — как интегрировать тестирование в CI/CD

Это покажет зрелый подход к разработке и понимание того, что security — это не отдельный feature, а часть каждой строки кода.