Безопасно ли использовать $_SERVER['HTTP_HOST']
все ссылки на сайте, не беспокоясь о XSS-атаках, даже если они используются в формах?
Да, это безопасно использовать $_SERVER['HTTP_HOST']
(и даже $_GET
и $_POST
), пока вы проверяете их, прежде чем принять их. Вот что я делаю для защищенных производственных серверов:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
Преимущество в $_SERVER['HTTP_HOST']
том, что его поведение более четко определено, чем $_SERVER['SERVER_NAME']
. Контраст ➫➫ :
Содержимое заголовка Host: из текущего запроса, если таковой имеется.
с участием:
Имя хоста сервера, под которым выполняется текущий скрипт.
Использование более определенного интерфейса, такого как, $_SERVER['HTTP_HOST']
означает, что большее количество SAPI будет реализовывать его, используя надежное, четко определенное поведение. (В отличие от других .) Однако он все еще полностью зависит от SAPI ➫➫ :
Нет никакой гарантии, что каждый веб-сервер предоставит любую из этих [ $_SERVER
записей]; серверы могут пропустить некоторые или предоставить другие, не перечисленные здесь.
Чтобы понять, как правильно получить имя хоста, прежде всего вам необходимо понять, что сервер, который содержит только код, не имеет возможности узнать (предварительное условие для проверки) свое собственное имя в сети. Он должен взаимодействовать с компонентом, который предоставляет ему свое имя. Это можно сделать через:
локальный конфигурационный файл
локальная база данных
жестко закодированный исходный код
внешний запрос ( curl )
Host:
запрос клиента / злоумышленника
и т.д
Обычно это делается через локальный (SAPI) файл конфигурации. Обратите внимание, что вы настроили его правильно, например, в Apache ➫➫ :
Несколько вещей нужно «подделать», чтобы динамический виртуальный хост выглядел как обычный.
Наиболее важным является имя сервера, которое используется Apache для генерации URL-адресов, на которые ServerName
имеются ссылки, и т. Д. Оно настраивается с помощью директивы и доступно для CGI через SERVER_NAME
переменную среды.
Фактическое значение, используемое во время выполнения, контролируется параметром UseCanonicalName.
При UseCanonicalName Off
этом имя сервера исходит из содержимого Host:
заголовка в запросе. С UseCanonicalName DNS
ним происходит от обратного DNS поиска по IP - адресу виртуального хоста. Первый параметр используется для динамического виртуального хостинга на основе имен, а второй - для ** хостинга на основе IP.
Если Apache не может работать имя сервера , потому что нет Host:
заголовка или DNS поиск неудачен , то значение , заданное с ServerName
используется вместо этого.