Какие методы обеспечения безопасности приложения ты знаешь?

«Какие методы обеспечения безопасности приложения ты знаешь?» — вопрос из категории Безопасность, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обеспечение безопасности — многослойный процесс ("глубинная защита"). Вот ключевые методы и практики, которые я применяю при разработке:

1. Защита от инъекций (Injection)

  • SQL-инъекции: Всегда используйте параметризованные запросы или ORM (Entity Framework), которые делают это автоматически.
    // ПЛОХО: Уязвимо
    var sql = $"SELECT * FROM Users WHERE Name = '{userInput}'";
    // ХОРОШО: Безопасно
    var sql = "SELECT * FROM Users WHERE Name = @name";
    command.Parameters.AddWithValue("@name", userInput);
  • XSS (Межсайтовый скриптинг): Кодируйте все данные, выводимые в HTML (Html.Encode() в ASP.NET). Используйте Content Security Policy (CSP).

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

  • Аутентификация: Используйте стандартные, проверенные библиотеки (ASP.NET Core Identity, OAuth 2.0 / OpenID Connect с провайдерами вроде Auth0, Azure AD). Храните пароли только в хешированном виде с "солью" (используйте PasswordHasher из Identity или алгоритмы типа Argon2, PBKDF2).
  • Авторизация: Реализуйте ролевую ([Authorize(Roles = "Admin")]) или политико-ориентированную модель ([Authorize(Policy = "CanEdit")]). Следуйте принципу наименьших привилегий.

3. Защита данных

  • Шифрование:
    • В транзите: Обязательное использование HTTPS (TLS 1.2+). Настраивайте HSTS.
    • В покое: Шифруйте конфиденциальные данные в БД (например, номера карт) с помощью симметричных алгоритмов (AES). Ключи шифрования храните в защищенных хранилищах (Azure Key Vault, AWS KMS).
  • Чувствительные данные в логах: Никогда не логируйте пароли, токены, PII. Используйте маскирование.
    logger.LogInformation("User {UserId} logged in", userId); // ХОРОШО
    logger.LogInformation("User with password {Password} logged in", rawPassword); // КАТЕГОРИЧЕСКИ НЕТ

4. Защита от атак на сессии и куки

  • Устанавливайте для кук флаги Secure (только HTTPS), HttpOnly (недоступны из JavaScript), SameSite (защита от CSRF).
  • Используйте встроенную защиту от CSRF в ASP.NET Core ([ValidateAntiForgeryToken]).

5. Безопасность API

  • Валидация входных данных: Всегда на стороне сервера, используя Data Annotations, FluentValidation.
  • Rate Limiting: Ограничение запросов для предотвращения DoS/брутфорса (можно через Microsoft.AspNetCore.RateLimiting).
  • CORS: Настройте политики CORS максимально строго, разрешая только необходимые домены.

6. Инфраструктура и зависимости

  • Обновления: Регулярно обновляйте фреймворки, пакеты NuGet и ОС для закрытия известных уязвимостей.
  • Сканирование зависимостей: Используйте dotnet list package --vulnerable или инструменты типа OWASP Dependency-Check, GitHub Dependabot.
  • Secrets Management: Никогда не храните секреты (строки подключения, API-ключи) в коде или конфигах. Используйте переменные окружения, Azure Key Vault, HashiCorp Vault.

7. Мониторинг и реагирование

  • Ведите аудит-логи критических действий (вход, изменение прав, доступ к данным).
  • Настройте алертинг на подозрительную активность (множество неудачных логинов).