Как запретить 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 (image menu)

Март 24, 2010 г.

Не все дизайнерские решения укладываются в оформление посредством css. В этот раз, это  - главное меню сайта. Нужно было изобразить отдельные пункты меню отдельными картинками, а активные элементы меню показать другими картинками. Есть действительно оригинальные ...

Читать

Подготовить библиотеки требуемые модулем webform

Март 21, 2024 г.

Webform объявляет множество библиотек, которые может использовать в webform.libraries.yml. Но устанавливать их предлагается так или иначе самостоятельно, т.к. их наличие ожидается в папке /libraries. Использование merge плагина Помимо описания ...

Читать

Как получить определения из конфигурационных файлов схем Drupal

Апрель 6, 2025 г.

Drupal config API позволяет не только прочитать сами настройки, но и файлы их определений. В общем то это очевидно, покажу как это делается. Допустим ...

Читать

Использование LIKE оператора в db_select Drupal

Февраль 4, 2021 г.

Если нужно использовать db_select вместо db_query, но не ясно как правильно составить SQL условие с оператором LIKE, читайте далее. Здесь вам пригодится хелпер функция db_like, которую нужно применить к аргументу сравнения. Небольшой пример ...

Читать
 

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

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



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