Cross-Site Scripting (XSS) — это тип уязвимости веб-приложений, при котором злоумышленник может внедрить вредоносный скрипт на страницу, доступную другим пользователям. Основные виды XSS:
Каждый из этих типов требует различных подходов к тестированию, однако базовая стратегия схожа: необходимо симулировать ввод опасных данных и проверить реакцию приложения.
Cypress предоставляет удобный инструмент для автоматизации тестов браузера и позволяет создавать сценарии для проверки XSS:
npm install cypress --save-dev
npx cypress open
Основная стратегия тестирования XSS с помощью Cypress заключается в двух этапах:
<script> или выполнения
JavaScript-кода.Пример теста для проверки Reflected XSS:
describe('Reflected XSS Test', () => {
it('Ввод скрипта в поисковое поле', () => {
cy.visit('/search');
cy.get('input[name="query"]')
.type('<script id="xss-test">alert("XSS")</script>');
cy.get('form').submit();
cy.get('#xss-test').should('exist');
});
});
Ключевой момент: использование уникального
идентификатора (id="xss-test") позволяет безопасно
отслеживать внедренный скрипт без фактического вызова
alert.
Для проверки Stored XSS необходимо имитировать сохранение опасного ввода:
describe('Stored XSS Test', () => {
it('Создание комментария с внедренным скриптом', () => {
cy.visit('/comments/new');
cy.get('textarea[name="comment"]')
.type('<script id="stored-xss">console.log("Stored XSS")</script>');
cy.get('form').submit();
cy.visit('/comments');
cy.get('#stored-xss').should('exist');
});
});
Особенности тестирования Stored XSS:
DOM-based XSS возникает, когда приложение использует данные пользователя напрямую для изменения DOM. Cypress позволяет проверять такие сценарии через манипуляцию URL и мониторинг DOM:
describe('DOM XSS Test', () => {
it('Внедрение скрипта через URL', () => {
cy.visit('/page#<img src=x oner ror=console.log("DOM XSS")>');
cy.get('img').should('have.attr', 'src', 'x');
});
});
Особенности:
innerHTML, чтобы убедиться в отсутствии
потенциального XSS.onerror, onclick),
Unicode и URL-кодированные варианты.cy.get('#xss-test')).cy.window().then(win => { ... })).Эти подходы позволяют безопасно выявлять XSS, не вызывая фактического выполнения скриптов, что важно для безопасного тестирования.
Cypress предоставляет гибкость для интеграции XSS-тестов с другими тестами:
xss/reflected,
xss/stored, xss/dom.Эта структура позволяет поддерживать полный цикл XSS-тестирования и внедрять его как стандартный компонент процесса обеспечения качества веб-приложения.