Заголовок Referer попал в спецификацию ещё в эпоху модемов. Никто особенно не спорил: серверу ведь полезно знать, откуда к нему пришёл пользователь. Прошло четверть века, браузеры сменили движки, а буква в названии так и осталась пропущенной. Парадокс в том, что вместе с архаичным написанием сохранилась и дурная привычка раскрывать лишнее. Разбираемся, почему эта, казалось бы, мелочь всё ещё приносит неприятности.
Откуда взялся Referer и что он передаёт
Первую версию протокола HTTP писали инженеры, не юристы по приватности. Поэтому заголовок всегда включал полный URL — с протоколом, доменом, путём и всем, что идёт после вопросительного знака. Если ссылка содержит токен сессии или уникальный идентификатор покупки, он улетает вслед за пользователем без дополнительных вопросов. RFC 9110 аккуратно поясняет, что писать надо именно «Referer», а не «Referrer», потому что иначе развалится огромный пласт старых систем. Читать в RFC
Кусочки данных, которые чаще всего уходят наружу
- Query-параметры с короткоживущими токенами.
- Номера заказов, приглашений, счёт-фактур.
- Строки поиска, когда они лежат в GET, а не POST.
Почему атакующий радуется каждому рефереру
Сам заголовок ничего не ломает. Он всего лишь доносчик. Но иногда этого достаточно. Представьте, что внешний скрипт, вставленный ради красивой кнопки, получает фрагмент ?csrf=9f8e7
. Если политика рефереров на сервере не сконфигурирована, токен окажется в логах третьей стороны. Ей останется только нажать на знакомую красную кнопку.
Четыре живых сценария эксплуатации
CSRF через изображение
Страница отрисовывает баннер с другого домена, а в URL у пользователя болтается одноразовый токен. Запрос картинки уносит токен к рекламной сети — дальше техника привычна: повторяем запрос с токеном, получаем успех.
Поисковые фразы в чужих логах
Внутренний поиск на портале отдаёт результаты через редирект. Сотрудник ищет «годовой отчёт по зарплате», кликает на документ, а трекер на внешнем CDN доволен: чувствительная фраза прилетела в Referer.
Deanonymization на форумах
Автор выкладывает ссылку на личный файл в облаке. Любой переход по внешним ссылкам с той же страницы раскрывает приватный URL владельцам стороннего сайта.
Доступ во внутреннюю тикет-систему
Техподдержка обменивается ссылками вида /ticket/4815?auth=temp
. Стоит сотруднику кликнуть на внешний ресурс без rel="noreferrer"
, и временный ключ уходит наружу.
Что уже умеют браузеры и чего этого мало
C середины 2020-х все основные браузеры переключились на политику strict-origin-when-cross-origin
. Она урезает реферер при переходе с HTTPS на HTTP, но при навигации между двумя HTTPS-сайтами query-строка остаётся нетронутой. Для большинства атак этого вполне достаточно.
Referrer-Policy как базовая линия обороны
Вариант «вставить заголовок и забыть» выглядит так:
Referrer-Policy: no-referrer
Если нужны данные для аналитики, можно смягчить до strict-origin
или origin-when-cross-origin
. Подробное матрасирование описано на MDN .
Атрибуты ссылок и микро-патчи в разметке
Раз уж мы всё равно пишем HTML, добавьте rel="noopener noreferrer"
ко всем внешним ссылкам. Это дёшево, мгновенно и почти не ломает статистику.
SPA и мета-тег referrer
Одностраничные приложения живут дольше, чем кажется. Потратьте пять минут и положите в <head>
строку:
<meta name="referrer" content="strict-origin">
Браузер применит правило ко всем динамическим ссылкам React, Vue или Angular — даже если о безопасности забыл фронтендер на аутсорсе.
Service Worker как хирургический инструмент
Когда нужна точечная фильтрация, перехватываем fetch
в Service Worker, обнуляем request.referrer
для подозрительных хостов. Гибко, но требует дисциплины: одна слабая проверка — и вы снова в нуле.
Памятка для разработчика
- Не храните секреты в GET-параметрах, если можно класть их в тело запроса.
- Проверьте, какой реферер отдают ваши страницы, используя вкладку «Network» в DevTools.
- Включите
no-referrer
по умолчанию и ослабляйте политику только там, где это оправдано. - Пробегитесь по проекту сканером OWASP ZAP или хотя бы SecurityHeaders .
- Не доверяйте сторонним скриптам — проверяйте, не меняют ли они политику на лету.
Инструменты, которые экономят время
- WaybackURLs — вытаскивает старые URL из Web Archive, иногда всплывают забытые токены.
- Smart Referer — расширение для Firefox, в цвете показывает, что утекает.
- Базовый
curl -I
с флагом-e
— быстрый способ увидеть, что действительно отправляет ваша страница.
Распространённые заблуждения
«У нас всё на HTTPS, утечек нет»
Шлюз-перехватчик не увидит тело запроса, это верно. Зато внешний сайт, на который уходит посетитель, получит весь URL целиком. Если в нём есть токен, вы его только что подарили.
«Браузер режет query-строку, если домены разные»
Не всегда. Стандартная политика режет только при переходе с HTTPS на HTTP. Перемещение между двумя безопасными схемами оставит параметры нетронутыми.
«Полный реферер критичен для аналитики»
Покажите аналитикам отчёт с обрезанным реферером — почти наверняка им хватит домена. Подпись UTM-меток в query-строке редко окупает риски.
Если вы отвечаете за бизнес-риски
Регуляторы ужесточают требования к персональным данным. Если ваша отрасль попадает под GDPR, HIPAA или местные аналоги, утечка через Referer — готовый кейс для штрафа. Поставьте no-referrer
по умолчанию, а маркетинговые кампании запускайте на поддоменах с более мягкой политикой.
Без громких финалов
Referer — не самая шумная брешь, но в сумме с десятком других мелочей она превращается в серьёзную проблему. Лучше устранить её, пока кто-то не решил воспользоваться тихим каналом передачи данных.