Происходит ли утечка информации через ваш Referer

Источник: «Security Tip: Is Your Referrer Leaking Information?»
Знаете ли вы, какая информация утекает через заголовок Referer, когда ваши пользователи переходят по внешним ссылкам?

Заголовок Referer отправляется как часть HTTP-запроса, указывая, откуда пришёл запрос. Это удобно для запросов внутри приложения, чтобы отслеживать, как пользователь перемещается между страницами, а также для запросов между различными сайтами для аналитики — так можно увидеть, какие сайты отправляют больше всего трафика в вашу сторону.

Хотя передача информации об источнике перехода внутри приложения невероятно полезна, она может быстро превратиться в угрозу безопасности, если передавать её за пределы приложения на сторонние сайты.

Например, вот список основных источников перехода из Securing Laravel Fathom Analytics:

Топ рефереров/источников перехода на Securing Laravel
Топ рефереров/источников перехода на Securing Laravel.

Вы заметили, что большинство из них неизвестны (Unknown), однако в этом списке есть и знакомые лица! (Включая LinkedIn, что удивительно!)

Если продолжить просматривать список рефереров, то можно обнаружить несколько источников перехода, выглядящих следующим образом:

intranet.somecompany.com
secure.corp.enterprise.com
scratchpad.person.com
do-not-share.secret.abc1232.company.com

Это всё приватные приложения, транслирующие своё существование всему миру!

Если бы у меня были вредоносные намерения, я мог бы использовать этот список для формирования перечня целей, начать разведку и в конечном итоге попытаться скомпрометировать каждый сайт. Некоторые из них были бы общедоступными, либо под парольным логином (время собирать учётные данные!), либо просто открытыми для всего мира и полагающимися на неизвестный домен. Другие будут внутренними, но знание доменного имени открывает возможность для CSRF-атаки и т. д.

Как предотвратить утечку информации о реферере/источнике перехода

Именно здесь на помощь приходит заголовок Referrer-Policy. Он контролирует, какая информация отправляется в заголовке Referer во время HTTP-запросов, и его можно использовать, чтобы контролировать, сколько (или насколько мало) информации будет отправлено в каждом запросе.

Основные параметры, на которые следует обратить внимание:

Referrer-Policy: strict-origin-when-cross-origin

Обратите внимание, что в настоящее время это значение используется по умолчанию, если не задана политика Referrer-Policy.

Внутренние запросы будут отправлять полный URL, т.е. https://securinglaravel.com/security-tip-are-your-refer/?query=string, а внешние — только протокол и домен, т.е. https://securinglaravel.com, за исключением случаев перехода с HTTPS на HTTP.

Используйте его, для трансляции домена вашего сайта, но не полного пути или строки запроса на внешние сайты.



Referrer-Policy: no-referrer-when-downgrade

Отправляется полный URL, т.е. https://securinglaravel.com/security-tip-are-your-refer/?query=string, при всех внутренних и внешних запросах, за исключением случаев перехода с HTTPS на HTTP.

Используйте его, чтобы транслировать полный путь к источнику на внешние сайты. Это настройка, которую Securing Laravel использует для трансляции того, из какой статьи пришёл пользователь.

Обратите внимание, что это может привести к утечке конфиденциальной информации, такой как хэши и сигнатуры в URL-адресах. Поэтому включайте эту функцию только на страницах, где URL могут быть общедоступными.



Referrer-Policy: same-origin

При внутренних запросах отправляется только полный URL, т.е. https://securinglaravel.com/security-tip-are-your-refer/?query=string. При внешних запросах источник перехода не указывается.

Используйте его, чтобы предотвратить утечку информации из заголовка Referer о вашем сайте, например, на внутренних или приватных страницах.


Я рассказал только о трёх вариантах заголовка Referrer-Policy, но есть и ряд других, которые могут понадобиться в определённых ситуациях. Вот полный список:

Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
Referrer-Policy: origin
Referrer-Policy: origin-when-cross-origin
Referrer-Policy: same-origin
Referrer-Policy: strict-origin
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: unsafe-url

Чтобы узнать больше, как они работают, ознакомьтесь с веб-документацией MDN.

Дополнительные материалы

Предыдущая Статья

Бесконечная прокрутка логотипов на чистом HTML и CSS

Следующая Статья

Иммутабельные даты Carbon в Laravel