Проверка headers безопасности

В современных веб-приложениях безопасность передачи данных играет критическую роль. 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

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 обеспечивает быстрый и надежный способ убедиться в защите веб-приложения от распространённых угроз. Такой подход позволяет интегрировать безопасность в процесс разработки и автоматизировать её контроль.