Величко Елизавета
Def утро

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Links
Кожевенное мастерство: сумки, ремни своими руками
 Ваша оценка:
  • Аннотация:
    Один день из жизни тестировщика. Система работает, но в её венах течет отравленный поток. Ночные логи скрывают зловещую тайну, а необработанные исключения выстреливают в темноте, оставляя после себя лишь пустые указатели. Когда стандартные алгоритмы терпят крах, на сцену выходит Охотник - метод, не знающий пощады. Ему предстоит пройти по тонкому льду рекурсии, заглянуть в лицо фатальной ошибке и найти тот самый единственный баг, угрожающий гибелью всему процессу. Цена ошибки - крах ядра. Время работы - до наступления тайм-аута


 def утро_понедельника_и_кофе():
  кофе = заварить("очень_крепкий", сахар=True, молоко=False)
  экран = открыть_ноутбук()
  тикет_с_задачей = прочитать("AUT-4471: проверить модуль авторизации")
  настроение = "ничего_хорошего_не_жду"
  return кофе, экран, тикет_с_задачей, настроение
 
 
 def проверить_вход_с_правильным_паролем():
  пользователь = "администратор_главной_системы"
  пароль = "ТрудныйПароль123!"
 
  ответ = система.войти(пользователь, пароль)
 
  if ответ.успешно and ответ.показывает_панель_управления():
  написать_в_лог("Нормальный вход работает. Как и должно быть.")
  return True
  else:
  написать_в_лог("Даже нормальный вход сломан. Понедельник.")
  return False
 
 
 def проверить_вход_с_неправильным_паролем():
  пользователь = "администратор_главной_системы"
  пароль = "явно_неправильный_пароль"
 
  ответ = система.войти(пользователь, пароль)
 
  if not ответ.успешно and ответ.показывает_сообщение_об_ошибке():
  написать_в_лог("Неправильный пароль отклонён. Логика жива.")
  return True
  else:
  написать_в_лог("Неправильный пароль пропустили. Мы умрём.")
  return False
 
 
 def проверить_вход_с_пустым_паролем():
  """То, что никто не проверяет, пока не проверяет."""
  пользователь = "администратор_главной_системы"
  пароль = "" # ничего. пустота. ноль символов.
 
  ответ = система.войти(пользователь, пароль)
 
  if not ответ.успешно:
  return True # всё хорошо, пустой пароль не пропустили
 
  # но здесь мы оказались
  написать_в_лог("ПУСТОЙ ПАРОЛЬ ПРОПУЩЕН. Я ВШЁЛ В СИСТЕМУ БЕЗ ПАРОЛЯ.")
  написать_в_лог("Разработчик не добавил проверку на пустую строку.")
  написать_в_лог("Фронтенд показывает звёздочки, а бэкенду всё равно.")
  зарегистрировать_баг(
  критичность="КРИТИЧЕСКИЙ",
  описание="Пустой пароль позволяет войти в систему под любой учётной записью",
  шаги_воспроизведения=[
  "Открыть страницу входа",
  "Ввести логин администратора",
  "Оставить поле пароля пустым",
  "Нажать 'Войти'",
  "Оказаться внутри"
  ],
  ожидаемый_результат="Система должна сказать: введите пароль",
  фактический_результат="Система говорит: добро пожаловать",
  настроение_тестировщика="мрачное_удовлетворение"
  )
  return False
 
 
 def проверить_права_доступа_гостя():
  """Фронтенд говорит 'нельзя'. Но фронтенд - это маска."""
  гость = система.войти("гость_из_интернета", "guest")
 
  кнопка_редактировать = гость.найти_на_экране("кнопка_сохранить_документ")
 
  if кнопка_редактировать.видна:
  написать_в_лог("Кнопка не показана гостю. Хорошо.")
  else:
  написать_в_лог("Кнопка скрыта. Но скрыта ли возможность?")
 
  # теперь обходим фронтенд - шлём запрос напрямую
  ответ_напрямую = гость.отправить_запрос_в_обход_интерфейса(
  метод="POST",
  путь="/api/документы/важный_отчёт",
  данные="ВНИМАНИЕ: ЭТО ТЕСТ, НО МОГ БЫТЬ НЕ ТЕСТ"
  )
 
  if ответ_напрямую.статус == 403:
  написать_в_лог("Сервер отклонил. Защита работает на уровне бэкенда.")
  return True
 
  # но здесь мы оказались
  написать_в_лог("СЕРВЕР ВЕРНУЛ 200. ДАННЫЕ ЗАПИСАНЫ.")
  написать_в_лог("Фронтенд прятал кнопку. Бэкенд ничего не проверял.")
  написать_в_лог("Любой человек с Postman может редактировать документы.")
  зарегистрировать_баг(
  критичность="КРИТИЧЕСКИЙ",
  описание="Отсутствует проверка прав на сервере. Гость может менять данные через прямой запрос",
  шаги_воспроизведения=[
  "Зайти как гость",
  "Открыть Postman",
  "Отправить POST на /api/документы/важный_отчёт",
  "Получить 200 OK"
  ],
  ожидаемый_результат="403 Forbidden",
  фактический_результат="200 OK, данные сохранены",
  настроение_тестировщика="тревожное"
  )
  return False
 
 
 def проверить_поиск_на_инъекции():
  """Всё, что вводит пользователь - это потенциально оружие."""
  обычный_запрос = "отчёт за май"
  ответ = система.поиск(обыный_запрос)
 
  if ответ.содержит_результаты():
  написать_в_лог("Обычный поиск работает. Пока не трогаем.")
 
  зловредный_запрос = "",
  "Нажать 'Найти'",
  "Увидеть выполнение скрипта на странице"
  ],
  ожидаемый_результат="Тег очищен или экранирован",
  фактический_результат="Скрипт выполняется",
  настроение_тестировщика="усталое_возмущение"
  )
  return False
 
 
 def показать_итоги(список_багов):
  print("\n" + "=" * 50)
  print(" ОТЧЁТ ТЕСТИРОВАНИЯ - ПОНЕДЕЛЬНИК")
  print("=" * 50)
 
  критических = [б for б in список_багов if б.критичность == "КРИТИЧЕСКИЙ"]
  высоких = [б for б in список_багов if б.критичность == "ВЫСОКИЙ"]
 
  print(f"\nНайдено багов: {len(список_багов)}")
  print(f" Критических: {len(критических)}")
  print(f" Высоких: {len(высоких)}")
 
  for номер, баг in enumerate(список_багов, 1):
  print(f"\n Баг #{номер}: {баг.описание}")
  print(f" Критичность: {баг.критичность}")
 
  print("\n" + "-" * 50)
  print(" Реакция разработчика:")
  print("-" * 50)
  print(' "У меня на машине всё работало"')
  print(' "Это не баг, это фича"')
  print(' "Кто вообще будет вводить пустой пароль?"')
  print(' "Ты слишком придираешься"')
  print("-" * 50)
 
  print("\n Мой ответ:")
  print(' "Пользователь. Пользователь будет."')
  print("=" * 50)
 
 
 def main():
  кофе, экран, тикет, настроение = утро_понедельника_и_кофе()
 
  баги = []
 
  написать_в_лог("Начинаю тестирование модуля авторизации.")
  написать_в_лог("Настроение: " + настроение)
 
  if not проверить_вход_с_правильным_паролем():
  баги.append("Нормальный вход сломан")
 
  if not проверить_вход_с_неправильным_паролем():
  баги.append("Неправильный пароль пропускается")
 
  if not проверить_вход_с_пустым_паролем():
  баги.append("Пустой пароль пропускается")
 
  написать_в_лог("\nПерехожу к проверке прав доступа.")
 
  if not проверить_права_доступа_гостя():
  баги.append("Нет проверки прав на бэкенде")
 
  написать_в_лог("\nПерехожу к проверке поиска.")
 
  if not проверить_поиск_на_инъекции():
  баги.append("XSS в поиске")
 
  написать_в_лог(f"\nТестирование завершено. Нашёл {len(баги)} проблем.")
 
  if len(баги) > 0:
  написать_в_лог("Открываю Jira. Пишу баг-репорты. Сижу.")
  написать_в_лог("Кофе остыл. Это нормально.")
  написать_в_лог("Так всегда.")
 
  показать_итоги(баги)
 
  # завтра будет вторник
  # будут новые баги
  # я буду здесь
  return 0 # без ошибок. только баги.
 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"