Drupal 7 ограничивает длину имени хоста только 1000 байтами, чтобы предотвратить DoS-атаки, и не принимает имена хостов, содержащие косую черту, но не ограничивает разрешенные имена хостов на основе значения, установленного в настройки.php файл, как это делают Drupal 8 и Drupal 9.
Код, проверяющий значение HTTP_HOST заголовок содержится в drupal_valid_http_host()
.
// Ограничить длину имени хоста до 1000 байт, чтобы предотвратить DoS-атаки с
// длинные имена хостов.
return strlen($host) <= 1000 && substr_count($host, '.') <= 100 && substr_count($host, ':') <= 100 && preg_match('/^\[?(?:[a -zA-Z0-9-:\]_]+\.?)+$/', $host);
Функция вызывается drupal_environment_initialize()
.
если (!isset($_SERVER['HTTP_REFERER'])) {
$_SERVER['HTTP_REFERER'] = '';
}
if (!isset($_SERVER['SERVER_PROTOCOL']) || $_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.0' && $_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.1') {
$_SERVER['SERVER_PROTOCOL'] = 'HTTP/1.0';
}
если (isset($_SERVER['HTTP_HOST'])) {
// Так как HTTP_HOST является вводом пользователя, убедитесь, что он содержит только разрешенные символы
// в именах хостов. См. RFC 952 (и RFC 2181).
// $_SERVER['HTTP_HOST'] здесь в нижнем регистре в соответствии со спецификациями.
$_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
если (!drupal_valid_http_host($_SERVER['HTTP_HOST'])) {
// HTTP_HOST недействителен, т.е. если содержит косые черты, это может быть атакой.
header($_SERVER['SERVER_PROTOCOL']. '400 Неверный запрос');
выход;
}
}
еще {
// Некоторые клиенты до HTTP/1.1 не будут отправлять заголовок Host. Убедитесь, что ключ
// определено для соответствия E_ALL.
$_SERVER['HTTP_HOST'] = '';
}
Существует патч, который должен добавить в Drupal 7 тот же код, что и в Drupal 8, в Заголовку HTTP_HOST нельзя доверять. На данный момент разработка Drupal 7 замедлилась, особенно с тех пор, как Drupal 8 и Drupal 9 разрабатывались одновременно.
Поскольку это считается улучшением безопасности (по-видимому, маловероятно, что это будет считаться проблемой безопасности, иначе проблема не будет обсуждаться публично), вы можете применить патч, представленный в этом выпуске (последний момент, когда я опубликовал этот ответ, https://www.drupal.org/files/issues/2021-02-04/http_host_header_cannot_bet_trusted-2221699-151.patch) и начните использовать $conf['trusted_host_patterns']
.