Content Security Policy

Content Security Policy (CSP) — это механизм безопасности веб-приложений, позволяющий ограничить источники ресурсов, которые может загружать страница. CSP предотвращает выполнение вредоносного кода, подгружаемого со сторонних сайтов, и минимизирует риски XSS-атак. В контексте автоматизированного тестирования с использованием Cypress понимание CSP критически важно, так как строгие политики безопасности могут препятствовать корректной работе тестов.


Принципы работы CSP

CSP задается сервером через заголовок HTTP Content-Security-Policy или через <meta>-тег в HTML-документе. Политика определяет:

  • default-src — базовый источник ресурсов.
  • script-src — разрешенные источники для JavaScript.
  • style-src — источники для CSS.
  • img-src — источники для изображений.
  • connect-src — допустимые endpoints для AJAX-запросов.
  • frame-src, font-src, media-src, object-src — ограничения для соответствующих типов ресурсов.

Например, политика:

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; img-src *

означает, что скрипты можно загружать только с того же домена и с cdn.example.com, а изображения — с любых источников.


CSP и Cypress

Cypress работает как прокси между браузером и тестируемым приложением. Он внедряет свои скрипты для управления страницей, наблюдения за сетевыми запросами, имитации событий пользователя и прочего. Если CSP запрещает выполнение inline-скриптов или подключение сторонних скриптов, это может приводить к ошибкам типа “Refused to execute inline script” или “Refused to load script”.

Особенности взаимодействия:

  1. Inline-скрипты и eval Cypress использует eval() и inline-скрипты для реализации своих команд. Если политика содержит script-src 'self', тесты могут не выполняться.

  2. XHR/Fetch запросы Строгий connect-src ограничивает доступ Cypress к внешним API и сервисам. Даже запросы к mock-серверам могут блокироваться.

  3. Фреймы и iframes Если приложение использует frame-src 'none' или строгие ограничения, Cypress может не иметь возможности получить доступ к содержимому фрейма.


Методы обхода CSP в тестах

Существует несколько подходов для работы с CSP в Cypress:

  1. Отключение CSP на время тестирования На сервере можно добавить отдельный конфиг для тестового окружения, где CSP минимизирован или отсутствует. Например:

    app.use((req, res, next) => {
      if (process.env.NODE_ENV === 'test') {
        res.removeHeader('Content-Security-Policy');
      }
      next();
    });

    Такой метод подходит для интеграционных тестов, где важно выполнение Cypress-команд, но не проверка политики безопасности.

  2. Использование заголовка Content-Security-Policy-Report-Only Этот режим позволяет браузеру логировать нарушения CSP без блокировки ресурсов. Полезно для тестирования без изменения политики на боевом сервере.

  3. Конфигурация Cypress через chromeWebSecurity В cypress.config.js можно отключить строгие проверки безопасности браузера:

    e2e: {
      chromeWebSecurity: false
    }

    Это упрощает тестирование скриптов, вставляемых Cypress, но снижает реальность тестовой среды.

  4. Модификация политики через прокси или серверный middleware Можно программно переписать заголовки CSP, добавив unsafe-inline и необходимые источники для тестов:

    script-src 'self' 'unsafe-inline' http://localhost:3000;

Влияние CSP на стратегии тестирования

  • E2E-тесты CSP влияет на выполнение большинства Cypress-команд. При строгой политике тесты на взаимодействие с DOM, эмуляцию кликов и загрузку скриптов могут не работать.

  • Тесты интеграции API Строгий connect-src может блокировать тестовые запросы к mock-серверам, что требует конфигурации прокси или изменения заголовков.

  • Селекторы и DOM-модификации Inline-стили и скрипты, внедряемые Cypress, могут быть заблокированы. Это важно при тестировании сложных компонентов, динамически создающих элементы.


Рекомендации при работе с CSP

  • Для тестового окружения использовать минимальные ограничения или режим report-only.
  • Для локального тестирования можно отключить chromeWebSecurity.
  • Для проверки безопасности создавать отдельные тесты CSP-совместимости, не смешивая их с обычными E2E-сценариями.
  • Проверять ошибки в консоли браузера, связанные с CSP, чтобы отличать реальные баги приложения от блокировок тестового фреймворка.

Отладка CSP в Cypress

  • Логи браузера: cy.log() и консоль DevTools показывают нарушения CSP.
  • Перехват заголовков: с помощью cy.intercept() можно проверить, какие политики приходят от сервера.
  • Проверка inline-скриптов: ошибки Refused to execute inline script однозначно указывают на необходимость корректировки script-src.

CSP является критически важной частью веб-безопасности, и при автоматизированном тестировании на Cypress необходимо учитывать его влияние на выполнение тестов. Неправильная конфигурация может приводить к ложным падениям тестов, поэтому важно разделять среды разработки, тестирования и продакшена, а также применять корректные подходы к обходу ограничений.