Drupal 7 chỉ giới hạn độ dài của tên máy chủ là 1000 byte để ngăn chặn các cuộc tấn công DoS và nó không chấp nhận tên máy chủ chứa dấu gạch chéo, nhưng nó không hạn chế tên máy chủ được phép dựa trên giá trị được đặt trong cài đặt.php tệp, giống như Drupal 8 và Drupal 9.
Mã kiểm tra giá trị của HTTP_HOST tiêu đề được chứa trong drupal_valid_http_host()
.
// Giới hạn độ dài của tên máy chủ là 1000 byte để ngăn chặn các cuộc tấn công DoS với
// tên máy chủ dài.
return strlen($host) <= 1000 && substr_count($host, '.') <= 100 && substr_count($host, ':') <= 100 && preg_match('/^\[?(?:[a -zA-Z0-9-:\]_]+\.?)+$/', $host);
Hàm được gọi bởi drupal_environment_initialize()
.
if (!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';
}
if (isset($_SERVER['HTTP_HOST'])) {
// Vì HTTP_HOST là đầu vào của người dùng, đảm bảo nó chỉ chứa các ký tự được phép
// trong tên máy chủ. Xem RFC 952 (và RFC 2181).
// $_SERVER['HTTP_HOST'] được viết thường ở đây theo thông số kỹ thuật.
$_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
if (!drupal_valid_http_host($_SERVER['HTTP_HOST'])) {
// HTTP_HOST không hợp lệ, ví dụ: nếu chứa dấu gạch chéo thì đó có thể là một cuộc tấn công.
tiêu đề($_SERVER['SERVER_PROTOCOL'] . ' 400 Yêu cầu không hợp lệ');
lối ra;
}
}
khác {
// Một số máy khách trước HTTP/1.1 sẽ không gửi tiêu đề Máy chủ. Đảm bảo chìa khóa là
// được xác định để tuân thủ E_ALL.
$_SERVER['HTTP_HOST'] = '';
}
Có một bản vá nên thêm vào Drupal 7 cùng mã được sử dụng bởi Drupal 8, trong Không thể tin cậy tiêu đề HTTP_HOST. Hiện tại, quá trình phát triển Drupal 7 bị chậm lại, đặc biệt là khi Drupal 8 và Drupal 9 được phát triển đồng thời.
Vì đó được coi là một cải tiến bảo mật (rõ ràng là ít có khả năng xảy ra để được coi là một vấn đề bảo mật hoặc vấn đề sẽ không được thảo luận công khai), bạn có thể áp dụng bản vá được cung cấp trong vấn đề đó (bản mới nhất là, tại thời điểm tôi đăng câu trả lời này, https://www.drupal.org/files/issues/2021-02-04/http_host_header_cannot_bet_trusted-2221699-151.patch) và bắt đầu sử dụng $conf['trusted_host_patterns']
.