Урок 4. Как браузер передаёт данные
В прошлом уроке мы проследили цепочку «действие → запрос → ответ → изменение страницы». Теперь разберём сам запрос и найдём, где браузер переносит введённые данные.
У HTTP-запроса есть метод, путь, заголовки и иногда тело. Данные могут находиться в разных местах — это зависит от действия и формата сообщения.
Одно действие выбирает метод и путь, а передаваемые данные могут находиться в query или в теле определённого формата.
1. Поиск: данные в строке запроса (query string)
Откройте работающий «Кружок», перейдите в «Проекты», введите robot и нажмите «Найти». Наблюдать Network пока не нужно: используйте подготовленную карточку обмена.
GET /projects?q=robot HTTP/1.1
Host: ваша-лаборатория
Метод — GET, путь — /projects, а значение robot находится в строке запроса после ?. Строка запроса является частью адреса запроса; тела здесь нет.
2. Обычная форма: поля в теле
Форма настроек может отправить пары имя=значение:
POST /settings HTTP/1.1
Content-Type: application/x-www-form-urlencoded
email=zoya%40kruzhok.local¬ifications=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, а отправить строку формы, сервер не обязан угадывать формат.
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 на другом проекте.
Разобрать четыре новых запроса
Уровень: базовое закрепление.
Разберите четыре новых запроса. После фрагментов выберите полное описание каждого запроса.
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-загрузку
Уровень: базовое закрепление.
В работающем «Кружке» войдите как учебный пользователь, откройте проект /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 связывают несколько запросов.