Mercurial > defr > drupal > core
comparison includes/bootstrap.inc @ 15:4347c45bb494 6.7
Drupal 6.7
author | Franck Deroche <webmaster@defr.org> |
---|---|
date | Tue, 23 Dec 2008 14:32:44 +0100 |
parents | 8b6c45761e01 |
children | 3edae6ecd6c6 |
comparison
equal
deleted
inserted
replaced
14:626fcabfa4b8 | 15:4347c45bb494 |
---|---|
1 <?php | 1 <?php |
2 // $Id: bootstrap.inc,v 1.206.2.6 2008/10/22 19:26:01 goba Exp $ | 2 // $Id: bootstrap.inc,v 1.206.2.7 2008/12/08 11:49:48 goba Exp $ |
3 | 3 |
4 /** | 4 /** |
5 * @file | 5 * @file |
6 * Functions that need to be loaded on every Drupal request. | 6 * Functions that need to be loaded on every Drupal request. |
7 */ | 7 */ |
236 return $conf; | 236 return $conf; |
237 } | 237 } |
238 | 238 |
239 $confdir = 'sites'; | 239 $confdir = 'sites'; |
240 $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']); | 240 $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']); |
241 if (strpos($_SERVER['HTTP_HOST'], '/') !== FALSE) { | |
242 // A HTTP_HOST containing slashes may be an attack and is invalid. | |
243 header('HTTP/1.1 400 Bad Request'); | |
244 exit; | |
245 } | |
246 $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.'))))); | 241 $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.'))))); |
247 for ($i = count($uri) - 1; $i > 0; $i--) { | 242 for ($i = count($uri) - 1; $i > 0; $i--) { |
248 for ($j = count($server); $j > 0; $j--) { | 243 for ($j = count($server); $j > 0; $j--) { |
249 $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i)); | 244 $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i)); |
250 if (file_exists("$confdir/$dir/settings.php") || (!$require_settings && file_exists("$confdir/$dir"))) { | 245 if (file_exists("$confdir/$dir/settings.php") || (!$require_settings && file_exists("$confdir/$dir"))) { |
270 } | 265 } |
271 } | 266 } |
272 } | 267 } |
273 | 268 |
274 /** | 269 /** |
270 * Validate that $_SERVER['HTTP_HOST'] is safe. | |
271 * | |
272 * As $_SERVER['HTTP_HOST'] is user input, ensure it only contains characters | |
273 * allowed in hostnames. See RFC 952 (and RFC 2181). $_SERVER['HTTP_HOST'] is | |
274 * lowercased. | |
275 * | |
276 * @return | |
277 * TRUE if only containing valid characters, or FALSE otherwise. | |
278 */ | |
279 function drupal_valid_http_host() { | |
280 $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']); | |
281 return preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $_SERVER['HTTP_HOST']); | |
282 } | |
283 | |
284 /** | |
275 * Loads the configuration and sets the base URL, cookie domain, and | 285 * Loads the configuration and sets the base URL, cookie domain, and |
276 * session name correctly. | 286 * session name correctly. |
277 */ | 287 */ |
278 function conf_init() { | 288 function conf_init() { |
279 global $base_url, $base_path, $base_root; | 289 global $base_url, $base_path, $base_root; |
280 | 290 |
281 // Export the following settings.php variables to the global namespace | 291 // Export the following settings.php variables to the global namespace |
282 global $db_url, $db_prefix, $cookie_domain, $conf, $installed_profile, $update_free_access; | 292 global $db_url, $db_prefix, $cookie_domain, $conf, $installed_profile, $update_free_access; |
283 $conf = array(); | 293 $conf = array(); |
294 | |
295 if (!drupal_valid_http_host()) { | |
296 // HTTP_HOST is invalid, e.g. if containing slashes it may be an attack. | |
297 header('HTTP/1.1 400 Bad Request'); | |
298 exit; | |
299 } | |
284 | 300 |
285 if (file_exists('./'. conf_path() .'/settings.php')) { | 301 if (file_exists('./'. conf_path() .'/settings.php')) { |
286 include_once './'. conf_path() .'/settings.php'; | 302 include_once './'. conf_path() .'/settings.php'; |
287 } | 303 } |
288 | 304 |
303 } | 319 } |
304 else { | 320 else { |
305 // Create base URL | 321 // Create base URL |
306 $base_root = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; | 322 $base_root = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; |
307 | 323 |
308 // As $_SERVER['HTTP_HOST'] is user input, ensure it only contains | 324 $base_url = $base_root .= '://'. $_SERVER['HTTP_HOST']; |
309 // characters allowed in hostnames. | |
310 $base_url = $base_root .= '://'. preg_replace('/[^a-z0-9-:._]/i', '', $_SERVER['HTTP_HOST']); | |
311 | 325 |
312 // $_SERVER['SCRIPT_NAME'] can, in contrast to $_SERVER['PHP_SELF'], not | 326 // $_SERVER['SCRIPT_NAME'] can, in contrast to $_SERVER['PHP_SELF'], not |
313 // be modified by a visitor. | 327 // be modified by a visitor. |
314 if ($dir = trim(dirname($_SERVER['SCRIPT_NAME']), '\,/')) { | 328 if ($dir = trim(dirname($_SERVER['SCRIPT_NAME']), '\,/')) { |
315 $base_path = "/$dir"; | 329 $base_path = "/$dir"; |