Content Security Policy (CSP) — это механизм безопасности веб-приложений, позволяющий ограничить источники ресурсов, которые может загружать страница. CSP предотвращает выполнение вредоносного кода, подгружаемого со сторонних сайтов, и минимизирует риски XSS-атак. В контексте автоматизированного тестирования с использованием Cypress понимание CSP критически важно, так как строгие политики безопасности могут препятствовать корректной работе тестов.
CSP задается сервером через заголовок HTTP
Content-Security-Policy или через
<meta>-тег в HTML-документе. Политика определяет:
Например, политика:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; img-src *
означает, что скрипты можно загружать только с того же домена и с
cdn.example.com, а изображения — с любых источников.
Cypress работает как прокси между браузером и тестируемым приложением. Он внедряет свои скрипты для управления страницей, наблюдения за сетевыми запросами, имитации событий пользователя и прочего. Если CSP запрещает выполнение inline-скриптов или подключение сторонних скриптов, это может приводить к ошибкам типа “Refused to execute inline script” или “Refused to load script”.
Особенности взаимодействия:
Inline-скрипты и eval Cypress использует
eval() и inline-скрипты для реализации своих команд. Если
политика содержит script-src 'self', тесты могут не
выполняться.
XHR/Fetch запросы Строгий
connect-src ограничивает доступ Cypress к внешним API и
сервисам. Даже запросы к mock-серверам могут блокироваться.
Фреймы и iframes Если приложение использует
frame-src 'none' или строгие ограничения, Cypress может не
иметь возможности получить доступ к содержимому фрейма.
Существует несколько подходов для работы с CSP в Cypress:
Отключение CSP на время тестирования На сервере можно добавить отдельный конфиг для тестового окружения, где CSP минимизирован или отсутствует. Например:
app.use((req, res, next) => {
if (process.env.NODE_ENV === 'test') {
res.removeHeader('Content-Security-Policy');
}
next();
});
Такой метод подходит для интеграционных тестов, где важно выполнение Cypress-команд, но не проверка политики безопасности.
Использование заголовка
Content-Security-Policy-Report-Only Этот режим
позволяет браузеру логировать нарушения CSP без блокировки ресурсов.
Полезно для тестирования без изменения политики на боевом
сервере.
Конфигурация Cypress через
chromeWebSecurity В cypress.config.js
можно отключить строгие проверки безопасности браузера:
e2e: {
chromeWebSecurity: false
}
Это упрощает тестирование скриптов, вставляемых Cypress, но снижает реальность тестовой среды.
Модификация политики через прокси или серверный
middleware Можно программно переписать заголовки CSP, добавив
unsafe-inline и необходимые источники для тестов:
script-src 'self' 'unsafe-inline' http://localhost:3000;E2E-тесты CSP влияет на выполнение большинства Cypress-команд. При строгой политике тесты на взаимодействие с DOM, эмуляцию кликов и загрузку скриптов могут не работать.
Тесты интеграции API Строгий
connect-src может блокировать тестовые запросы к
mock-серверам, что требует конфигурации прокси или изменения
заголовков.
Селекторы и DOM-модификации Inline-стили и скрипты, внедряемые Cypress, могут быть заблокированы. Это важно при тестировании сложных компонентов, динамически создающих элементы.
report-only.chromeWebSecurity.cy.log() и консоль
DevTools показывают нарушения CSP.cy.intercept() можно проверить, какие политики приходят от
сервера.Refused to execute inline script однозначно указывают на
необходимость корректировки script-src.CSP является критически важной частью веб-безопасности, и при автоматизированном тестировании на Cypress необходимо учитывать его влияние на выполнение тестов. Неправильная конфигурация может приводить к ложным падениям тестов, поэтому важно разделять среды разработки, тестирования и продакшена, а также применять корректные подходы к обходу ограничений.