Введение
Добро пожаловать в лабораторную работу по взаимодействию с веб-приложениями. В сфере кибербезопасности и веб-автоматизации программное взаимодействие с веб-приложениями является фундаментальным навыком. Независимо от того, занимаетесь ли вы парсингом данных, тестированием на уязвимости или автоматизацией рутинных задач, вам необходим надежный инструмент для отправки и получения HTTP-запросов.
В этой лабораторной работе вы научитесь использовать мощную библиотеку Python requests. Вы напишете скрипты для отправки HTTP-запросов GET и POST, извлечения важной информации из ответов сервера, автоматизации отправки форм и управления сессионными cookie для поддержания состояния аутентификации.
По сравнению с низкоуровневыми сокетами, requests работает на более высоком уровне абстракции. Библиотека берет на себя многие детали HTTP, такие как заголовки, кодировка, перенаправления и cookie. Это делает её идеальным инструментом для автоматизации в сфере безопасности, где важнее понимать логику работы веб-приложения и сценарии взаимодействия, чем разбираться в побайтовой структуре пакетов.
Отправка HTTP-запросов GET
На этом этапе вы научитесь отправлять базовый HTTP-запрос GET с помощью Python. Метод GET используется для получения данных с указанного ресурса — точно так же, как ваш браузер запрашивает веб-страницу, когда вы вводите URL.
Рассматривайте это как простейшую форму веб-автоматизации: запрос ресурса и анализ ответа. Многие задачи разведки, тестирования и мониторинга начинаются именно с этого.
Сначала убедитесь, что вы находитесь в директории проекта. Именно здесь вы будете создавать все свои Python-скрипты для этой лабораторной работы.
cd ~/project
Теперь создадим Python-скрипт для отправки GET-запроса на локальный веб-сервер, который был подготовлен для вас. Используйте текстовый редактор nano для создания файла get_request.py:
nano get_request.py
Введите следующий код на Python в редактор:
import requests
url = 'http://127.0.0.1:5000/get'
response = requests.get(url)
print("Response Body:")
print(response.text)
Сохраните файл и выйдите из редактора (в nano нажмите Ctrl+O, Enter для сохранения и Ctrl+X для выхода).
Приведенный выше код импортирует библиотеку requests, определяет целевой URL и использует функцию requests.get() для отправки запроса. Ответ сервера сохраняется в переменной response, после чего мы выводим содержимое тела ответа.
Запустите скрипт с помощью интерпретатора Python:
python3 get_request.py
Вы должны увидеть результат, похожий на этот:
Response Body:
{"message":"GET request successful"}
Извлечение HTTP-статуса и заголовков
На этом этапе вы научитесь извлекать более подробную информацию из HTTP-ответа, а именно код состояния и заголовки.
Тело ответа — это лишь часть информации. Коды состояния сообщают о том, как сервер интерпретировал запрос, а заголовки содержат метаданные, такие как тип контента, политика кэширования, cookie или информация о серверном ПО. Качественная автоматизация учитывает все три уровня: код, заголовки и тело ответа.
Когда сервер отвечает на HTTP-запрос, он включает код состояния (например, 200 для OK или 404 для Not Found) и заголовки, предоставляющие метаданные об ответе.
Создайте новый файл check_status.py в директории проекта:
nano check_status.py
Добавьте в файл следующий код:
import requests
url = 'http://127.0.0.1:5000/get'
response = requests.get(url)
print(f"Status Code: {response.status_code}")
if response.status_code == 200:
print("The request was successful!")
print("\nResponse Headers:")
print(f"Content-Type: {response.headers.get('Content-Type')}")
print(f"Server: {response.headers.get('Server')}")
Сохраните файл и выйдите из редактора.
В этом скрипте response.status_code извлекает целочисленный код состояния, возвращенный сервером. response.headers — это объект, похожий на словарь, содержащий все HTTP-заголовки, отправленные сервером. Мы используем метод .get() для безопасного извлечения конкретных заголовков.
Запустите скрипт, чтобы увидеть извлеченную информацию:
python3 check_status.py
Ваш вывод должен выглядеть так:
Status Code: 200
The request was successful!
Response Headers:
Content-Type: application/json
Server: Werkzeug/3.0.1 Python/3.10.12
Автоматизация отправки форм (POST)
На этом этапе вы научитесь отправлять HTTP-запрос POST. В отличие от GET-запросов, которые используются для получения данных, POST-запросы используются для отправки данных на сервер. Это часто применяется для отправки веб-форм, например, учетных данных при входе в систему.
Это различие отражает семантику HTTP. На практике GET обычно используется для чтения ресурсов, а POST — для действий, которые отправляют данные или изменяют состояние. Понимание этой разницы помогает предсказывать поведение приложений и то, как ваши скрипты должны с ними взаимодействовать.
Мы напишем скрипт для имитации отправки формы входа с именем пользователя и паролем.
Создайте новый файл post_request.py:
nano post_request.py
Введите следующий код:
import requests
url = 'http://127.0.0.1:5000/post'
## Define the form data as a dictionary
form_data = {
'username': 'admin',
'password': 'secret'
}
## Send the POST request with the data parameter
response = requests.post(url, data=form_data)
print(f"Status Code: {response.status_code}")
print(f"Response Body: {response.text}")
Сохраните файл и выйдите из редактора.
Здесь мы определяем словарь form_data, содержащий наши учетные данные. Затем мы используем requests.post() и передаем наш словарь в параметр data. Библиотека requests автоматически форматирует эти данные как стандартную отправку веб-формы.
Запустите скрипт для отправки формы:
python3 post_request.py
Вы должны увидеть сообщение об успешном входе:
Status Code: 200
Response Body: {"message":"Login successful"}
Вы можете попробовать изменить пароль в скрипте на неверный (например, wrongpass) и запустить его снова, чтобы увидеть, как сервер ответит кодом 401 Unauthorized.
Управление сессионными cookie
На этом заключительном этапе вы научитесь управлять сессионными cookie. HTTP — это протокол без сохранения состояния, что означает, что каждый запрос независим. Чтобы «узнать» пользователя после входа в систему, веб-приложения используют cookie.
Если вы используете requests.get() или requests.post() напрямую, cookie не сохраняются между запросами. Чтобы поддерживать сессию (например, оставаться авторизованным), необходимо использовать объект Session, предоставляемый библиотекой requests.
Создайте файл session_request.py:
nano session_request.py
Добавьте следующий код:
import requests
## Create a Session object
session = requests.Session()
login_url = 'http://127.0.0.1:5000/login'
profile_url = 'http://127.0.0.1:5000/profile'
print("Attempting to access profile BEFORE login...")
response1 = session.get(profile_url)
print(f"Status: {response1.status_code}, Body: {response1.text.strip()}")
print("\nLogging in to establish a session...")
## The session object will automatically store cookies returned by the server
session.post(login_url)
print("\nAttempting to access profile AFTER login...")
## The session object will automatically send the stored cookies with this request
response2 = session.get(profile_url)
print(f"Status: {response2.status_code}, Body: {response2.text.strip()}")
Сохраните файл и выйдите из редактора.
В этом скрипте requests.Session() создает постоянную сессию. Когда мы отправляем POST-запрос на /login, сервер устанавливает сессионный cookie. Объект Session сохраняет этот cookie и автоматически включает его в последующий GET-запрос к /profile, что позволяет нам получить доступ к защищенному маршруту.
Запустите скрипт:
python3 session_request.py
Проанализируйте вывод. Вы увидите, что первая попытка завершилась неудачей, так как мы не вошли в систему, но вторая попытка прошла успешно, поскольку сессионный cookie был обработан автоматически:
Attempting to access profile BEFORE login...
Status: 401, Body: {"message":"Unauthorized"}
Logging in to establish a session...
Attempting to access profile AFTER login...
Status: 200, Body: {"message":"Welcome to your profile!"}
Резюме
Вы научились использовать библиотеку Python requests для автоматизации взаимодействия с веб-приложениями. Вы начали с отправки базовых HTTP-запросов GET и извлечения важных метаданных, таких как коды состояния и заголовки. Затем вы перешли к отправке HTTP-запросов POST для автоматизации заполнения форм. Наконец, вы узнали, как использовать объекты Session для управления cookie и поддержания состояния аутентификации на протяжении нескольких запросов.
Эти навыки составляют основу для многих продвинутых задач в области веб-парсинга, интеграции API и автоматизированного тестирования безопасности.



