[регрессия] встраивание iframe с разрешённым доменом src не работает

Привет! Я добавил https://www.tickcounter.com в allowed_iframes, но этот скрипт всё равно не отображается:

<div style="left:0; width:100%; height:0; position:relative; padding-bottom:25%; margin:0 auto"><iframe src="https://www.tickcounter.com/widget/countdown/5847336" style="top:0; left:0; width:100%; height:100%; position:absolute; border:0; overflow:hidden" title="Мой обратный отсчет"></iframe></div>

В логах ошибок, насколько я вижу, ничего нет.

Также не сработал другой встроенный iframe с другого домена, который я разрешил.

В точности такой же встроенный iframe с того же домена работал в последний раз, когда я его пробовал, возможно, 6 месяцев или год назад. Сейчас у меня Discourse v3.3.1 +5 (стабильная ветка).

В последней версии ветки tests-passed iframe встраивается без проблем. Обратите внимание, что атрибуты style и title, которые вы установили, будут удалены Discourse. Однако вы можете установить атрибуты width и height. Например:

<iframe src="https://www.tickcounter.com/widget/countdown/5847336" width="100%"></iframe>

Что вы видите, когда переходите к сообщению, а затем открываете вкладку «Elements» (Элементы) в инструментах разработчика вашего браузера?

А что, если открыть вкладку «Console» (Консоль) в инструментах разработчика? Есть ли какие-либо ошибки?

:thinking: Хм. У меня тоже всё работает, как и ожидалось.

admin - все настройки сайта - разрешённые iframe:

превью:

отформатированный пост:

Спасибо большое за ответы.

<div class="regular contents"><div class="cooked"></div><section class="post-menu-area clearfix"><nav class="post-controls expanded">

Хм, есть несколько ошибок:

Failed to load resource: net::ERR_CONNECTION_REFUSED
beacon.min.js:1

Но это, похоже, связано с моим DNS-черным списком. Когда я подключаюсь через VPN, ошибок нет. И кажется не случайностью, что другой пользователь с совершенно другим компьютером и сетью изначально сообщил мне об этой же проблеме.

Хорошо, Firefox показывает мне ещё одно сообщение в консоли:

Предоставлен доступ к разделённому cookie или хранилищу для «https://www.tickcounter.com/widget/countdown/4471981», так как он загружен в контексте третьей стороны и динамическое разделение состояния включено.
[Узнать больше]

Также хочу упомянуть, что я вставил код iframe в шаблонный статический HTML-файл и открыл его в браузере, и iframe загрузился корректно.

Хорошо, этот iframe раньше у вас работал… Вы случайно не используете Cloudflare? Если да, то, возможно, стоит проверить, поможет ли отключение функции Speed Brain (если она включена). Я знаю, что это относительно новая функция.

Привет, нет, я не использую Cloudflare.

Да, я могу заставить iframe работать. Что-то блокирует его на вашем форуме.

Хм, да, похоже именно так. Но разве в Discourse не должно быть ошибки в /logs/?

Насколько я знаю, на сервере ничего не запущено, что могло бы это блокировать. Я использовал DNS провайдера хостинга в /etc/resolv.conf, и попробовал переключить его на 8.8.8.8, но это не изменило ситуацию с этой проблемой.

Только если это вызывает ошибку. Возможно, что-то блокирует это в рамках нормальной работы. Я думаю, стоит попытаться выяснить, что изменилось или какие изменения произошли в момент, когда это перестало работать. Мне интересно, не могло ли это быть связано с изменением политики безопасности контента (Content Security Policy).

Получается, вы говорите, что используете список блокировки DNS, и это что-то ломает, поэтому не стоит его использовать?

Вы добавили

или

https://www.tickcounter.com/ в настройку разрешённых iframe?

Это DNS-сервис, который блокирует домены с плохой репутацией. Но дело не в этом, потому что: 1) когда я подключаюсь через VPN, используется другой DNS, и проблема сохраняется; 2) пользователь, сообщивший мне об этой проблеме, использует совершенно другую конфигурацию; 3) настройка DNS относится только к моей локальной сети, а не к серверу Discourse, который не может корректно генерировать HTML на стороне сервера; и 4) этот HTML-файл успешно загружает iframe:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta name="description" content="Webpage description goes here" />
  <meta charset="utf-8">
  <title>Change_me</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="author" content="">
</head>

<body>

<div style="left:0; width:100%; height:0; position:relative; padding-bottom:25%; margin:0 auto"><iframe src="https://www.tickcounter.com/widget/countdown/5847336" style="top:0; left:0; width:100%; height:100%; position:absolute; border:0; overflow:hidden" title="My countdown"></iframe></div>

</body>
</html>

Ого, вот оно что! Не хватало завершающего /.
Большое спасибо!

В Discourse что-то изменилось, потому что в прошлый раз, когда я пробовал это сделать, я добавил https://www.tickcounter.com, и тогда всё работало. На мой взгляд, нужно либо скорректировать логику регулярного выражения, либо уточнить описание настройки, поскольку в ней сказано:

Список префиксов доменов в атрибуте src для iframe, которые Discourse может безопасно разрешать в постах

Когда я слышу «префикс домена», я представляю имя домена и/или поддомен, ни одно из которых не включает /. Или же, если предполагается использование более точной логики для сложных URL в атрибуте src iframe, то описание должно звучать примерно так:

Список префиксов URL в атрибуте src для iframe, которые Discourse может безопасно разрешать в постах

Когда вы добавляете ссылку, под полем должно отображаться сообщение об ошибке о том, что нужен ещё один слэш

Проблема заключается в ссылках, добавленных более 2 месяцев назад (до того, как был слит исправление безопасности). В то время вы не получали сообщение об ошибке, и даже ссылки по умолчанию не содержали третьего символа «/». Это уже вторая тема поддержки, связанная с этой проблемой:

Да, я wondered, если это так — что существующие ссылки где-то по пути сломались. :thinking:

Возможно ли проверить существующие записи и уведомить администраторов о неработающих ссылках?

Для меня самым большим источником путаницы было то, что это называется «доменом», хотя на самом деле это URL.