Как запретить 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 flag модуль - некоторые элементы API

Ноябрь 9, 2016 г.

Очередная шпаргалка по Drupal, рассматриваем функции API модуля flag, для вызова их из кода программы PHP. Вы можете найти много материалов, посвященных настройке плагина flag, работе с ним из админки, но совсем мало - описанию функций API. ...

Читать

Добавить произвольную ссылку в меню на этапе препросессинга в Drupal

Март 17, 2025 г.

Иногда бывает потребность создать ссылку из кода. Структура ссылки довольно сложная на этапе препроцессинга шаблона меню, делюсь сниппетом кода. Потребуются следующие зависимости: [crayon-6a96e8b922fe3100787031/] Добавим ссылку в меню main. ...

Читать

Вывод сообщений валидации формы рядом с формой

Март 20, 2019 г.

При возникновении ошибок, во время проверки формы друпал выполняет две вещи, которые отражаются на фронт-энд - добавляет сообщение об ошибке в стек сообщений и маркирует классом error поле, содержащее ошибку. Если форма находится далеко от места вывода ...

Читать

Программный переход на главную страницу в Drupal

Март 20, 2017 г.

Для программных переходов (переадресаций) в drupal используется функция drupal_goto(). Как с её помощью отправить пользователя на главную страницу? Синоним вроде '<front>', или путь '/' не сработают, так как они не являются внутренними маршрутами ...

Читать
 

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

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



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