Как запретить 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 больше не нужен.

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

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

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

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

Доводим модуль transliteration в Drupal

Июль 11, 2016 г.

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

Читать

Меню в виде SELECT в Drupal 7

Февраль 1, 2017 г.

Drupal обладает развитым набором инструментов с menu, т.к. меню - это одна из составляющих частей Drupal API. Хотя модуль Menu, входящий в состав ядра, ...

Читать

Интеграция Usercentrics CMP в Drupal

Октябрь 21, 2021 г.

Интеграция не сложна в принципе, т.к. Usercentrics CMP ставит задачу упростить сбор разрешений пользователя и управление скриптами на основе данных разрешений. Первым шагом интеграции является подключение скриптов CMP в заголовок (head) страницы ...

Читать

Чтение данных из oembed провайдера

Март 11, 2025 г.

В Drupal 10/11 поддержка Oembed провайдеров в ядре (модуль media) позволяет легко и непринуждённо читать данные о медиа прямо из провайдера. Ранее я рассказывал как зарегистрировать oembed для rutube, чтобы иметь возможность оперировать видео контентом ...

Читать
 

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

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



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