Урок 4. Как браузер передаёт данные

В прошлом уроке мы проследили цепочку «действие → запрос → ответ → изменение страницы». Теперь разберём сам запрос и найдём, где браузер переносит введённые данные.

У HTTP-запроса есть метод, путь, заголовки и иногда тело. Данные могут находиться в разных местах — это зависит от действия и формата сообщения.

Четыре способа передать данные: query string, form-urlencoded, JSON и multipart

Одно действие выбирает метод и путь, а передаваемые данные могут находиться в query или в теле определённого формата.

1. Поиск: данные в строке запроса (query string)

Откройте работающий «Кружок», перейдите в «Проекты», введите robot и нажмите «Найти». Наблюдать Network пока не нужно: используйте подготовленную карточку обмена.

GET /projects?q=robot HTTP/1.1
Host: ваша-лаборатория

Метод — GET, путь — /projects, а значение robot находится в строке запроса после ?. Строка запроса является частью адреса запроса; тела здесь нет.

Где находится слово robot в GET /projects?q=robot? · 5 б.

2. Обычная форма: поля в теле

Форма настроек может отправить пары имя=значение:

POST /settings HTTP/1.1
Content-Type: application/x-www-form-urlencoded

email=zoya%40kruzhok.local&notifications=on

Здесь /settings — путь, а имя и значения полей находятся после пустой строки в теле. Заголовок Content-Type сообщает серверу, как разобрать это тело.

Строка запроса и тело формы похожи синтаксисом пар, но занимают разные места: строка запроса входит в адрес, тело передаётся после заголовков.

3. JSON: объект в теле

POST /api/profile HTTP/1.1
Content-Type: application/json

{"display_name":"Zoya API"}

JSON тоже находится в теле. Сервер ожидает объект, потому что запрос объявляет Content-Type: application/json. Если объявить JSON, а отправить строку формы, сервер не обязан угадывать формат.

Что подсказывает серверу, как разобрать тело запроса? · 5 б.

4. Файл: multipart/form-data

Форма с файлом собирает тело из нескольких частей:

POST /projects/1/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=course-boundary

--course-boundary
Content-Disposition: form-data; name="document"; filename="notes.txt"
Content-Type: text/plain

наблюдения ученика
--course-boundary--

boundary разделяет части. Имя поля — document, имя файла — notes.txt, а text/plain описывает содержимое этой части. Здесь мы изучаем только отправку формы; безопасность загрузок и различия парсеров появятся позже.

Сопоставьте действие и носитель

Действие Метод и путь Где данные Content-Type тела
Найти robot GET /projects строка запроса q тела нет
Сохранить email POST /settings тело формы application/x-www-form-urlencoded
Изменить имя через API POST /api/profile тело JSON application/json
Отправить заметку POST /projects/1/upload части multipart multipart/form-data

Дальше используются новые пути и значения, которых нет в таблице: сначала разберите четыре незнакомых фрагмента, затем подтвердите multipart на другом проекте.

Разобрать четыре новых запроса

10 б.

Уровень: базовое закрепление.

Разберите четыре новых запроса. После фрагментов выберите полное описание каждого запроса.

GET /catalog?tag=sensors&sort=new HTTP/1.1
Host: lab.example
PATCH /profile HTTP/1.1
Content-Type: application/x-www-form-urlencoded

display_name=Mira&city=Kazan
POST /comments HTTP/1.1
Content-Type: application/json

{"project_id":7,"text":"Отличная схема"}
POST /gallery/avatar HTTP/1.1
Content-Type: multipart/form-data; boundary=avatar-42

--avatar-42
Content-Disposition: form-data; name="image"; filename="robot.png"
Content-Type: image/png

Для GET учитывайте query в пути и отсутствие тела. Ответы должны относиться именно к этим четырём фрагментам.

Подтвердить новую multipart-загрузку

10 б.

Уровень: базовое закрепление.

В работающем «Кружке» войдите как учебный пользователь, откройте проект /projects/2 и загрузите новый файл sensor-note.txt с коротким текстом humidity=48.

После отправки заполните отдельные поля под заданием по фактическому multipart-запросу.

Используйте только факты нового запроса к проекту 2.

Где это пригодится на олимпиаде

В задаче «Вавиловы счета» для 10 класса на региональном этапе ВсОШ 2025 года участник изменял multipart-загрузку и XML в Burp Suite Repeater (источник: официальный разбор задачи, стр. 1–2). В задаче «Ведьмина книга» для 9 класса на региональном этапе 2026 года участник находил POST /api/brew, читал JSON и отправлял изменённый объект (источник: официальный разбор задачи). Здесь важно не угадывать уязвимость, а точно определить метод, путь, носитель данных и заявленный формат тела.

Вывод

Метод и путь не показывают, где именно переданы данные. Значение может находиться в строке запроса, обычном теле формы, JSON или отдельной части multipart; выбрать правильный способ чтения помогает Content-Type. Для формы с файлом multipart дополнительно хранит границы частей, имена полей и сведения о файле.

Следующий урок использует эту модель для последовательности входа: мы увидим, как заголовки Set-Cookie, Cookie и Location связывают несколько запросов.