Как протестировать функционал авторизации на веб-сайте?

Ответ

Тестирование авторизации включает проверку функциональности, безопасности и устойчивости к атакам.

Основные сценарии:

  1. Позитивные тесты:
    • Успешный вход с валидными учетными данными.
    • Выход (logout) и завершение сессии.
    • Восстановление пароля через email/телефон.
  2. Негативные тесты:
    • Вход с неверным логином или паролем (должна быть общая ошибка, не уточняющая, что именно неверно).
    • Вход с пустыми полями.
    • Превышение лимита неудачных попыток с последующей блокировкой.
    • Истечение срока действия сессии (timeout).
  3. Тесты на безопасность:
    • SQL-инъекция: Попытка ввода ' OR '1'='1 в поля логина/пароля.
    • XSS: Попытка ввода <script>alert('XSS')</script>.
    • Перебор учетных данных (Brute-force): Проверка наличия задержки или капчи после нескольких неудач.
    • Перехват сессии: Попытка использовать украденный или поддельный токен.

Пример теста для API на Python (с использованием requests):

import requests

def test_successful_login():
    url = "https://api.example.com/login"
    payload = {"username": "valid_user", "password": "valid_pass"}
    response = requests.post(url, json=payload)

    assert response.status_code == 200
    assert "access_token" in response.json()
    assert "refresh_token" in response.json()

def test_sql_injection_prevention():
    url = "https://api.example.com/login"
    payload = {"username": "' OR '1'='1", "password": "any"}
    response = requests.post(url, json=payload)

    # Ожидаем отказ в авторизации, а не успешный вход или 500 ошибку
    assert response.status_code == 401 or response.status_code == 400

Ответ 18+ 🔞

О, смотри-ка, какая тема подъехала — тестирование авторизации! Это ж святое, блядь. Тут не просто кнопочки потыкать, а целый боевой полигон, где можно и функциональность проверить, и безопасность, и как система от атак отбивается. Ёпта, целая наука, а не работа.

Ну, слушай сюда, распишу по полочкам, что там обычно проверяют, чтобы потом не вышло, что любой долбоёб с улицы к тебе в админку зашёл.

Основные сцены, где мы будем ломать копья:

  1. Тесты, когда всё хорошо (позитивные):

    • Нормальный вход по логину-паролю, чтобы токены выдали. Всё как у людей.
    • Выход (logout), чтобы сессия нахуй закрылась и токен сдох.
    • Восстановление пароля — ну, там письмо на почту пришло, ссылка рабочая, всё такое.
  2. Тесты, когда всё идёт по пизде (негативные):

    • Вход с левыми данными. И тут главное, блядь, чтобы система не сдала, что именно не так: логин или пароль. Должна быть одна общая, уклончивая ошибка, типа «неверные данные», а не «ой, а пароль-то у тебя кривой, дружок».
    • Вход с пустыми полями. Тут и ежу понятно, что должно ругаться.
    • Сделал пять раз хуйню — получи блокировку на 15 минут. Защита от тупого перебора.
    • Сидел, сидел в системе, вышел покурить — а сессия уже сдохла (timeout). Заново логинься, мудила.
  3. А вот это самая соль, тесты на безопасность (тут уже весело):

    • SQL-инъекция. Подсовываем в поле логина классику жанра: ' OR '1'='1. Система должна послать нас нахуй с ошибкой авторизации, а не пропустить внутрь или, что ещё хуже, выдать 500-ю ошибку, показав свою жопу.
    • XSS. Пытаемся впихнуть <script>alert('XSS')</script>. Если после ввода этого в поле и отображения на странице у тебя всплывает окошко — всё, пиши пропало, система дырявая.
    • Перебор (Brute-force). Тупо скриптом долбим запросами. Надеемся, что после N-ой попытки нас либо заблокируют, либо капчу подсунут, либо хотя бы задержку ответа сделают.
    • Перехват сессии. Нашли/украли/сгенерировали левый токен? Пробуем им воспользоваться. Система должна сказать: «Иди нахуй, пидор, это не твой пропуск».

Ну и для наглядности, смотри, как это примерно в коде выглядит (на Python с requests):

import requests

def test_successful_login():
    url = "https://api.example.com/login"
    payload = {"username": "valid_user", "password": "valid_pass"}
    response = requests.post(url, json=payload)

    assert response.status_code == 200
    assert "access_token" in response.json()
    assert "refresh_token" in response.json()

def test_sql_injection_prevention():
    url = "https://api.example.com/login"
    payload = {"username": "' OR '1'='1", "password": "any"}
    response = requests.post(url, json=payload)

    # Ожидаем отказ в авторизации, а не успешный вход или 500 ошибку
    assert response.status_code == 401 or response.status_code == 400

Вот, понимаешь? Во втором тесте мы ждём, что система умная и не поведётся на эту детскую уловку. Если она вернёт 200 и токен — это пиздец и позор разработчикам. Если 500 — тоже плохо, потому что раскрыла внутреннюю ошибку. А должна чётко и вежливо сказать: «401 Unauthorized, пошёл вон».

Вот так вот, ебать, и проверяем, чтобы не было стыдно перед пользователями и перед тем, кто потом будет аудит безопасности проводить.