В современных веб-приложениях безопасность передачи данных играет критическую роль. HTTP-заголовки безопасности помогают предотвратить множество атак, включая XSS (Cross-Site Scripting), Clickjacking и другие уязвимости, связанные с браузером. Cypress предоставляет гибкие инструменты для проверки этих заголовков на стороне клиента и сервера.
1. Content-Security-Policy (CSP) Определяет, какие ресурсы разрешено загружать на страницу. Позволяет ограничить выполнение скриптов, стилей, подключаемых медиа и других ресурсов.
Пример заголовка:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
2. Strict-Transport-Security (HSTS) Принуждает браузер использовать только HTTPS-соединение, предотвращая атаки типа MITM (Man-in-the-Middle).
Пример:
Strict-Transport-Security: max-age=31536000; includeSubDomains
3. X-Frame-Options Запрещает встраивание страницы в iframe, защищая от Clickjacking.
Возможные значения:
DENY — запрещает полностью.SAMEORIGIN — разрешает только на том же домене.ALLOW-FROM uri — разрешает для конкретного
источника.4. X-Content-Type-Options Предотвращает
MIME-sniffing, принуждая браузер использовать заявленный
Content-Type. Значение:
X-Content-Type-Options: nosniff
5. Referrer-Policy Контролирует, какие данные реферера отправляются на другие сайты. Пример:
Referrer-Policy: no-referrer-when-downgrade
Cypress позволяет выполнять HTTP-запросы и проверять заголовки на
уровне сервера через команду cy.request(). Это эффективный
способ убедиться, что сервер возвращает все необходимые заголовки
безопасности.
Пример проверки заголовков:
describe('Security headers validation', () => {
it('Проверка основных заголовков безопасности', () => {
cy.request('https://example.com').then((response) => {
// Проверка CSP
expect(response.headers).to.have.property('content-security-policy');
expect(response.headers['content-security-policy']).to.include("default-src 'self'");
// Проверка HSTS
expect(response.headers).to.have.property('strict-transport-security');
expect(response.headers['strict-transport-security']).to.include('max-age=31536000');
// Проверка X-Frame-Options
expect(response.headers).to.have.property('x-frame-options');
expect(response.headers['x-frame-options']).to.match(/DENY|SAMEORIGIN/);
// Проверка X-Content-Type-Options
expect(response.headers).to.have.property('x-content-type-options', 'nosniff');
// Проверка Referrer-Policy
expect(response.headers).to.have.property('referrer-policy');
});
});
});
Ключевые моменты:
cy.request() не загружает страницу в браузере, что
позволяет проверять заголовки независимо от визуального рендеринга.response.headers возвращает объект с заголовками в
нижнем регистре, что важно учитывать при проверках.Некоторые заголовки можно дополнительно проверять через
cy.visit(), анализируя поведение страницы. Например,
заголовок X-Frame-Options можно протестировать попыткой
встраивания страницы в iframe:
describe('X-Frame-Options client-side test', () => {
it('Страница не должна встраиваться в iframe', () => {
cy.visit('about:blank').then((win) => {
const iframe = win.document.createElement('iframe');
iframe.src = 'https://example.com';
win.document.body.appendChild(iframe);
cy.wrap(iframe).should('have.prop', 'contentWindow').and('be.null');
});
});
});
Этот метод имитирует сценарий, когда злоумышленник пытается встраивать страницу, проверяя, что браузер блокирует такой доступ.
Для регулярного контроля безопасности рекомендуется интегрировать проверки заголовков в CI/CD-процесс. Cypress легко позволяет запускать тесты в рамках пайплайна, автоматически фиксируя отсутствие критических заголовков.
Пример добавления теста в CI:
{
"scripts": {
"test:security": "cypress run --spec 'cypress/e2e/security/*.cy.js'"
}
}
Такая структура позволяет хранить все проверки безопасности отдельно и обновлять их по мере изменения требований.
Permissions-Policy, Expect-CT,
Feature-Policy.Проверка HTTP-заголовков безопасности с помощью Cypress обеспечивает быстрый и надежный способ убедиться в защите веб-приложения от распространённых угроз. Такой подход позволяет интегрировать безопасность в процесс разработки и автоматизировать её контроль.