Как запретить Drupal использовать sites/default для неизвестных хостов

В Drupal при использовании мультисайтовой конфигурации (sites/sites.php) существует скрытая особенность: если домен не найден в $sites, Drupal по умолчанию загружает настройки из sites/default. Это может привести к неожиданным проблемам:

  • Открытие сайта по IP-адресу;
  • Подмена домена в Host-заголовке (в том числе в атакующих целях);
  • Доступ к сайту в неподходящем контексте (на продакшене с тестовым доменом и т.д.);
  • Использование кеша с абсолютными ссылками с «чужого домена»;
  • и т.д.

К счастью, поведение легко изменить.

Вообще это — частая и недооценённая проблема. Когда Drupal начинает обслуживать сайт по «чужому» домену (например, IP-адресу, левому хосту или поддомену без настройки), он может:

  • генерировать абсолютные ссылки (<link href="http://bad-host/...">)
  • создавать кешированные страницы с неправильными base_url
  • вставлять canonical, og:url, hrefLang и другие теги с неправильным доменом

Всё это приводит к:

  • случайному загрязнению кеша (page cache, render cache, dynamic page cache) — особенно в анонимных сессиях
  • ошибкам CORS (Cross-Origin Resource Sharing) при загрузке ресурсов (шрифтов, скриптов и т. д.)
  • дублированию страниц в поисковой выдаче с «левыми» доменами
  • невалидной индексации, особенно если сайт проксируется или тестируется с других хостов

Решение

Решение заключается в жестком контроле разрешенных доменов.

Пример sites/sites.php с жёстким контролем

Этот код явно перечисляет допустимые домены, которым разрешён доступ к сайту. Если значение заголовка HTTP_HOST не найдено в списке, выполнение прерывается и возвращается ошибка 403 Forbidden — это происходит ещё до загрузки ядра Drupal. Таким образом, исключается возможность обращения к сайту через незарегистрированные домены, включая IP-адреса или подставленные имена, и блокируется нежелательный fallback на sites/default.

Дополнительно:

Если sites/default не используется — удалите папку её.

Удаление папки sites/default без дополнительных ограничений может привести к непредсказуемым ошибкам при обращении с незарегистрированного домена. Drupal будет пытаться использовать sites/default как fallback, и при её отсутствии выдаст фатальную ошибку. Поэтому удаление этой папки имеет смысл только после того, как вы настроили фильтрацию допустимых доменов в sites/sites.php, и убедились, что sites/default больше не нужен.

Зачем это нужно

Такая проверка:

  • Повышает безопасность;
  • Исключает случайные ошибки при деплое;
  • Делает мультисайт более предсказуемым;
  • Предотвращает «размывание» конфигурации, когда один и тот же сайт начинает открываться с нескольких хостов, не предназначенных для этого.

Мало букафф? Читайте есчо !

Убрать копейки при выводе цены Drupal/Commerce

Май 16, 2021 г.

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

Читать

Программно удаляем тип публикации в Drupal

Март 15, 2018 г.

Всё, что вы можете сделать из админки, может быть сделано программно. Удаление типа публикации в Drupal тоже можно сделать из кода на PHP. Перед тем как удалить тип публикации, возможно, стоит подчистить экземпляры нод данного типа. Потому сначала ...

Читать

Убираем вставку &nbsp; в пустые div контейнеры в CKEditor 5

Апрель 9, 2025 г.

Неприятная особенность CKEditor - добавляет в пустые контейнера (в <div>,<p> и т.п.) html код неразрывного пробела. Покажу как можно от этого избавиться через код в кастомном плагине для CKEditor 5 в экосистеме Drupal 8+. Нам понадобится ...

Читать

Миграция картинки по URL в Media поле (Drupal)

Март 3, 2024 г.

Мне нужен был обработчик для migration API, который создаёт media entity по URL и возвращает его ID. Обработчики представляют из себя расширения ProcessPluginBase, которые нужно размещать в папке /src/Plugin/migrate/process вашего модуля. Файл ...

Читать
 

Комментарии к «Как запретить Drupal использовать sites/default для неизвестных хостов»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: