Index: includes/bootstrap.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v retrieving revision 1.263 diff -u -p -r1.263 bootstrap.inc --- includes/bootstrap.inc 4 Jan 2009 16:15:54 -0000 1.263 +++ includes/bootstrap.inc 7 Jan 2009 17:20:21 -0000 @@ -392,6 +392,18 @@ function drupal_initialize_variables() { if (!isset($_SERVER['SERVER_PROTOCOL']) || ($_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.0' && $_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.1')) { $_SERVER['SERVER_PROTOCOL'] = 'HTTP/1.0'; } + // Some pre-HTTP/1.1 clients will not send a Host header. Ensure the key is + // defined for E_ALL compliance. + if (!isset($_SERVER['HTTP_HOST'])) { + $_SERVER['HTTP_HOST'] = ''; + } + + if (!drupal_valid_http_host()) { + // HTTP_HOST is invalid, e.g. if containing slashes it may be an attack. + header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request'); + exit; + } + // Enforce E_ALL, but allow users to set levels not part of E_ALL. error_reporting(E_ALL | error_reporting()); @@ -422,8 +434,13 @@ function drupal_initialize_variables() { * TRUE if only containing valid characters, or FALSE otherwise. */ function drupal_valid_http_host() { - $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']); - return preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $_SERVER['HTTP_HOST']); + if (isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] != '') { + $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']); + return preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $_SERVER['HTTP_HOST']); + } + else { + return TRUE; + } } /** @@ -437,12 +454,6 @@ function conf_init() { global $databases, $db_prefix, $cookie_domain, $conf, $installed_profile, $update_free_access; $conf = array(); - if (!drupal_valid_http_host()) { - // HTTP_HOST is invalid, e.g. if containing slashes it may be an attack. - header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request'); - exit; - } - if (file_exists(DRUPAL_ROOT . '/' . conf_path() . '/settings.php')) { include_once DRUPAL_ROOT . '/' . conf_path() . '/settings.php'; } Index: modules/simpletest/tests/bootstrap.test =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/bootstrap.test,v retrieving revision 1.9 diff -u -p -r1.9 bootstrap.test --- modules/simpletest/tests/bootstrap.test 3 Dec 2008 14:51:53 -0000 1.9 +++ modules/simpletest/tests/bootstrap.test 7 Jan 2009 17:20:21 -0000 @@ -68,7 +68,7 @@ class BootstrapIPAddressTestCase extends // Cluster environment. $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] = $this->cluster_ip; $this->assertTrue( - ip_address(true) == $this->cluster_ip, + ip_address(TRUE) == $this->cluster_ip, t('Cluster environment got cluster client IP') ); $_SERVER['HTTP_HOST'] = 'security/.drupal.org:80'; @@ -81,6 +81,10 @@ class BootstrapIPAddressTestCase extends $this->assertFalse(drupal_valid_http_host(), t('HTTP_HOST with .. is invalid')); $_SERVER['HTTP_HOST'] = '[::1]:80'; // IPv6 loopback address $this->assertTrue(drupal_valid_http_host(), t('HTTP_HOST containing IPv6 loopback is valid')); + $_SERVER['HTTP_HOST'] = ''; + $this->assertTrue(drupal_valid_http_host(), t('Empty HTTP_HOST is valid')); + $_SERVER['HTTP_HOST'] = NULL; + $this->assertTrue(drupal_valid_http_host(), t('NULL HTTP_HOST is valid')); } }