Нет `Referer:`, нет встраивания

Привет,

Мы используем встраивание Discourse для Jekyll по адресу New ROOT Web Site! - ROOT — всё работает отлично! Однако, если браузер подавляет заголовок Referer:, мы получаем ошибку 400 Bad Request. Попробуйте сами: если переключиться в приватное окно Firefox (которое подавляет рефереры), встраивание перестаёт работать. То же самое касается Safari, который, кажется, более строго относится к передаче рефереров.

Я перепроверил, зайдя по ссылке New ROOT Web Site! - Blog - ROOT Forum в приватном окне Firefox — получил HTTP 400. Затем я отредактировал запрос, добавив Referer: https://root.cern/blog/new-web-site/, и ошибка 400 сменилась на успешный ответ 200.

У нас включена опция «встраивание с любого домена». Комментарии настроены только для одного сайта встраивания. Есть ли способ заставить это работать?

С наилучшими пожеланиями,
Аксель.

Да, я могу воспроизвести это.

Интересно, что встроенные комментарии на https://blog.codinghorror.com/the-cloud-is-just-someone-elses-computer/ работают без проблем в приватном окне Firefox. Возможно, проблема связана с доменом? Ваш блог находится на root.cern, а форма — на root-forum.cern.ch.

Привет, Саймон,

Спасибо, что посмотрел это! Это вполне может быть связано с различием в доменных именах: я могу представить, что браузеры передают реферер для запросов к одному и тому же домену, но не для запросов к другому домену. Но хотя это интересно, я пока не вижу, что мы можем сделать, чтобы исправить это — мы не сможем использовать root.cern в качестве домена форума, а встраивание между доменами казалось ключевой и очень полезной функцией… Просто ли это становится рискованным в наши дни из-за усиления защиты конфиденциальности, или ты можешь предложить какой-то выход?

Возможно, я попробую настроить обратный прокси с root.cern/forum на root-forum.cern.ch. Тогда встраивание можно будет выполнить так, будто оно происходит на том же хосте, и мы сохраним реферер…? Вернусь к тебе :slight_smile:

С наилучшими пожеланиями,
Аксель

Привет,

У меня теперь есть гораздо более простое решение. Об этом, вероятно, стоит упомянуть в Embed Discourse comments on another website via Javascript :

Для встраивания между сайтами на страницах встраивания добавьте либо

  • <meta name="referrer" content="strict-origin"> с настройкой Path Allowlist (список разрешённых путей) как /.* (поскольку путь не будет предоставлен), либо
  • <meta name="referrer" content="no-referrer-when-downgrade"> с реальным Path Allowlist.

Как упоминается в Referrer-Policy header - HTTP | MDN, «браузеры предпринимают усилия по переходу к более строгому значению по умолчанию», а встраивание Discourse опирается на старое значение по умолчанию для встраивания между разными хостами.

С уважением, Аксель.

Учитывая, что это станет стандартом браузера по умолчанию в Chrome 85 и выше (A new default Referrer-Policy for Chrome - strict-origin-when-cross-origin  |  Blog  |  Chrome for Developers), стоит ли нам рассмотреть альтернативу?

Можем ли мы принимать запросы, которые соответствуют всем следующим трём условиям:

  • Запрос содержит как discourseEmbedUrl, так и Referer;
  • Referer установлен в значение origin для discourseEmbedUrl;
  • discourseEmbedUrl соответствует одному из правил встраивания.

Я думаю, что передача discourseEmbedUrl будет несложной для большинства пользователей.

Просто предупреждение, Теджас: насколько мне известно, без тега meta Safari и Firefox в приватном режиме полностью подавляют заголовок Referer. То, что вы предлагаете, может сработать в Chrome >= 85, но добавление тега meta выглядит более надежным и универсальным решением. И я подозреваю, что для большинства встраиваний это достаточно тривиально?