Ввести одинарную кавычку ' в любое текстовое поле и посмотреть на ошибку базы данных: это базовая проверка SQL-инъекции которая занимает десять секунд и не требует никаких security-инструментов. Подменить ID ресурса другого пользователя в URL и проверить получишь ли доступ: это проверка на broken object-level authorization, одну из самых распространённых уязвимостей API, и она уже входит в область QA при функциональном тестировании. Статья разбирает проверки аутентификации, авторизации, валидации ввода и cookie которые QA-инженеры могут запускать без специалистов, с Playwright-примерами для тех из них которые стоит автоматизировать.
Что QA-инженеры могут тестировать без специализированных инструментов
Аутентификация и управление сессиями
Самые распространённые баги безопасности находятся в auth-флоу. Тестируй при обычном функциональном тестировании.
Защита от брутфорса. Попробуй ввести неверный пароль 10 раз. Блокирует ли приложение аккаунт или применяет rate limit? Если нет: это находка. Session fixation. Войди в систему. Скопируй cookie сессии. Выйди. Попробуй использовать старый cookie сессии. Если всё ещё работает: сессии не инвалидируются при выходе. Срок действия "Запомнить меня". Включи "запомнить меня", закрой браузер, открой через 30 дней (или переведи системные часы вперёд). Сессия ещё работает? Как долго? Повторное использование токена сброса пароля. Запроси письмо сброса. Используй ссылку для сброса. Попробуй ссылку снова. Должна быть недействительной. Если работает дважды: баг. Одновременные сессии. Войди в двух разных браузерах одновременно. Должна ли инвалидироваться одна из сессий?Авторизация (контроль доступа)
Здесь прячется большинство серьёзных багов.
Горизонтальное повышение привилегий. Создай два аккаунта (пользователь A и пользователь B). Под пользователем A создай ресурс (заказ, документ, элемент профиля). Запомни ID ресурса в URL. Войди как пользователь B. Попробуй получить доступ, отредактировать или удалить ресурс пользователя A по ID. Если получилось: это BOLA (broken object-level authorization), одна из самых распространённых уязвимостей API.GET /api/orders/12345 ← заказ пользователя AВойди как пользователь B и обратись по тому же URL. Что происходит?
Вертикальное повышение привилегий. Попробуй получить доступ к admin-функциям как обычный пользователь. Проверяй admin-URL (/admin, /dashboard/admin, /api/admin/*) без admin-учётных данных.
IDOR в API-ответах. Возвращает ли API только данные которые должен видеть текущий пользователь? Проверяй не попадают ли в любое поле API-ответа обычного пользователя данные других пользователей.
Валидация ввода
Каждое поле формы: потенциальная точка инъекции.
SQL-инъекция (базовая проверка). Введи' (одинарную кавычку) в любое текстовое поле. Возвращает ли приложение ошибку базы данных? Если да: вероятно уязвимо.
XSS (базовая проверка). Введи в любое поле которое отображается другим пользователям (поля имени, комментарии, адреса). Если появляется alert: это stored XSS.
Path traversal. Попробуй ../../../etc/passwd в полях имени файла или URL-параметрах. Должна возвращаться ошибка, а не содержимое файла.
Эти ручные тесты быстрые и ловят очевидные уязвимости. Они не заменяют автоматизированное security-сканирование, но стоят запуска на каждой новой фиче.
HTTPS и cookie
Проверяй в DevTools браузера:
- Сайт работает по HTTPS? HTTP редиректит на HTTPS?
- Сессионные cookie помечены
HttpOnly(недоступны из JavaScript)? - Сессионные cookie помечены
Secure(передаются только по HTTPS)? - Для auth-cookie установлен
SameSiteвStrictилиLax?
В Playwright:
test('auth cookie has security flags', async ({ page, context }) => {
await page.goto('/login');
// ... выполняем вход
const cookies = await context.cookies();
const sessionCookie = cookies.find(c => c.name === 'session_token');
expect(sessionCookie?.httpOnly).toBe(true);
expect(sessionCookie?.secure).toBe(true);
expect(sessionCookie?.sameSite).toMatch(/strict|lax/i);
});Сообщения об ошибках и раскрытие информации
Слишком информативные сообщения об ошибках: проблема безопасности.
"Пользователь не найден"против"Неверные учётные данные": первое говорит атакующим какие аккаунты существуют- Стек-трейсы в ответах продакшна
- Внутренние пути сервера, имена баз данных или версии библиотек в сообщениях об ошибках
- API-ответы с полями вроде
passwordHash,internalIdили флагами администратора
Как интегрировать security в процесс тестирования
Базовое сканирование OWASP ZAP
OWASP ZAP бесплатен и может работать как пассивный сканер параллельно с Playwright-тестами. Режим baseline scan обходит приложение и сигнализирует об очевидных проблемах:
# .github/workflows/security.yml
- name: ZAP Baseline Scan
uses: zaproxy/action-baseline@v0.10.0
with:
target: 'https://staging.myapp.com'
rules_file_name: '.zap/rules.tsv'Ловит отсутствующие security-заголовки, небезопасные cookie и раскрытую информацию о сервере без написания тест-кода.
Проверка security-заголовков
Заголовки которые должно отправлять приложение:
Content-Security-Policy: default-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-originТест в Playwright:
test('security headers are present', async ({ request }) => {
const response = await request.get('https://myapp.com');
const headers = response.headers();
expect(headers['x-content-type-options']).toBe('nosniff');
expect(headers['x-frame-options']).toBe('DENY');
expect(headers['strict-transport-security']).toContain('max-age=');
});Что передавать security-специалистам
Часть security-тестирования требует специализированных навыков и инструментов:
- Полное пентестирование
- Анализ бинарных файлов
- Ревью криптографии
- Безопасность инфраструктуры (облачная конфигурация, сегментация сети)
- Тестирование социальной инженерии
Когда находишь потенциальную проблему безопасности через ручное тестирование: документируй чётко (шаги воспроизведения, потенциальное влияние) и эскалируй в security-команду или фиксируй как баг с высокой серьёзностью. Не пытайся самостоятельно доказать эксплуатируемость. Твоя задача: найти, а не эксплуатировать.
Лучшая security-позиция: эшелонированная защита. QA ловит очевидные проблемы в процессе разработки, автоматизированные сканеры ловят системные проблемы в CI, специалисты делают глубокое ревью перед крупными релизами.
→ See also: Тестирование безопасности для QA инженеров: что нужно знать | Жизненный цикл разработки программного обеспечения для QA-инженеров | Тестирование на основе рисков: как расставить приоритеты, когда нельзя протестировать всё