Лучшие практики безопасности веб-приложений | Вопросы для собеседования | Skilio
Лучшие практики безопасности веб-приложений
Вопрос:

Какие обычно обеспечивается безопасность в веб-приложении на TypeScript? Объясните, как бы вы реализовали защиту от распространенных уязвимостей, таких как XSS и CSRF-атаки, и так далее.

Подсказки:

  • Рассмотрите стратегии валидации ввода и санитизации данных
  • Настройка заголовков безопасности HTTP (CORS) на сервере и балансировщиках нагрузки
  • Подумайте о безопасных протоколах связи и механизмах аутентификации
  • Не забудьте рассмотреть аспекты безопасности как на стороне клиента, так и на стороне сервера
  • Детали реализации политики безопасности контента (CSP)
  • Аутентификация с использованием JWT или на основе сессий
  • Разница в хранении сессий или JWT в куках или передаче программно через заголовки запросов

Выше ожиданий:

  • Неизменяемость ресурса (SRI)
  • Знание хотя бы одного протокола: OAuth2, OpenID, SAML
Ответ:

Валидация и очистка (санитизация) входных данных

  • Реализовать строгую проверку типов с помощью системы типов TypeScript для валидации структур данных.
  • Использовать библиотеки валидации, такие как Zod или Yup (много их), для проверки пользовательских входов во время выполнения.
  • Применять очистку пользовательского контента перед отображением или сохранением:
// Пример с использованием DOMPurify
import DOMPurify from 'dompurify';
const sanitizedContent = DOMPurify.sanitize(userInput);

Предотвращение межсайтовых скриптов (XSS)

  • Включить заголовки Content Security Policy (CSP) для управления загрузкой ресурсов:
    • Установить default-src 'self' для разрешения только ресурсов из того же источника.
    • Настроить директивы script-src и style-src для внешних ресурсов.
  • Использовать вставки шаблонов или JSX вместо прямой манипуляции DOM.
  • Применять автоматическое экранирование в движках шаблонов или фреймворках.
  • Реализовать куки HttpOnly для предотвращения доступа JavaScript к конфиденциальным данным.

Защита от межсайтовых поддельных запросов (CSRF)

  • Генерировать уникальные CSRF-токены для каждой сессии.
  • Проверять токены на стороне сервера для операций изменения состояния.
  • Использовать атрибут куки SameSite для управления запросами из разных источников.
  • Реализовать шаблон Double Submit Cookie:
    • Сохранять токен в куки HttpOnly.
    • Отправлять тот же токен в заголовках запроса или полях формы.

Аутентификация и управление сессиями

  • Использовать JWT (JSON Web Tokens) для бессерверной аутентификации:
    • Сохранять токены в куках HttpOnly для защиты от XSS.
    • Реализовать правильную ротацию и истечение срока действия токенов.
    • Включить механизм токен обновления.
  • Альтернатива: аутентификация на основе сессий:
    • Сохранять идентификаторы сессий в защищенных куках.
    • Реализовать таймаут и ротацию сессий.
    • Использовать защищенное хранилище сессий на сервере.

CORS (Cross-Origin Resource Sharing)

  • Настроить правильные заголовки CORS на сервере:
    • Access-Control-Allow-Origin
    • Access-Control-Allow-Methods
    • Access-Control-Allow-Headers
  • Реализовать обработку предварительных запросов для сложных запросов.
  • Использовать подход списка разрешенных источников для доверенных источников.

Защищенные коммуникации

  • Обеспечить HTTPS с помощью:
    • HSTS (HTTP Strict Transport Security)
    • Правильной конфигурации SSL/TLS.
    • Фиксации сертификатов при необходимости.
  • Реализовать Subresource Integrity (SRI):
    <script src="script.js" 
      integrity="sha384-hash"
      crossorigin="anonymous">
    </script>
    

Дополнительные меры безопасности

  • Использовать заголовки безопасности HTTP:
    • X-Frame-Options
    • X-Content-Type-Options
    • Referrer-Policy
  • Реализовать ограничение скорости для API-точек входа.
  • Применять безопасное управление зависимостями:
    • Регулярные аудиты безопасности.
    • Автоматизированное сканирование уязвимостей.
    • Поддерживать актуальность зависимостей.

Лучшие практики для хранения данных

  • Конфиденциальные данные:
    • Никогда не хранить в localStorage/sessionStorage.
    • Использовать зашифрованные куки HttpOnly.
    • Реализовать правильное шифрование конфиденциальных данных.
  • Токены доступа:
    • Короткий срок действия.
    • Безопасное хранение в памяти.
    • Правильная валидация токенов.

Обработка ошибок и ведение журнала

  • Реализовать защищенную обработку ошибок:
    • Специальные страницы ошибок.
    • Очищенные сообщения об ошибках.
    • Правильное ведение журнала без конфиденциальных данных.
  • Использовать безопасное ведение журнала:
    • Попытки аутентификации.
    • События, связанные с безопасностью.
    • Аудит операций с конфиденциальными данными.

Этот комплексный подход создает несколько уровней защиты, следуя принципу защиты в глубину. Регулярные аудиты безопасности и обновления необходимы для поддержания защиты от эволюционирующих угроз.

0
TypeScript Старший Опубликовано
© Skilio, 2025
Условия использования
Политика конфиденциальности
Мы используем файлы cookie, для персонализации сервисов и повышения удобства пользования сайтом. Если вы не согласны на их использование, поменяйте настройки браузера.