Происходит ли утечка информации через ваш Referer
Заголовок Referer
отправляется как часть HTTP-запроса, указывая, откуда пришёл запрос. Это удобно для запросов внутри приложения, чтобы отслеживать, как пользователь перемещается между страницами, а также для запросов между различными сайтами для аналитики — так можно увидеть, какие сайты отправляют больше всего трафика в вашу сторону.
Хотя передача информации об источнике перехода внутри приложения невероятно полезна, она может быстро превратиться в угрозу безопасности, если передавать её за пределы приложения на сторонние сайты.
Например, вот список основных источников перехода из Securing Laravel Fathom Analytics:
Вы заметили, что большинство из них неизвестны (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.