ли «безопасно», чтобы использовать $_SERVER['HTTP_HOST']
для всех ссылок на сайте, не беспокоясь о нападениях XSS, даже при использовании в формы?
Да, это safe использовать $_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']
означает, что больше SAPIs будет осуществлять его с помощью надежного вполне определенного поведения. (В отличие от the other.) Тем не менее, он по-прежнему полностью зависит от SAPI ➫➫:
Там нет никакой гарантии, что каждый веб-сервер будет предоставлять какие-либо из этих [$_SERVER
записей]; серверы могут опускать некоторые или предоставлять другим, не перечисленным здесь.
Чтобы понять, как правильно получить имя хоста, в первую очередь, вы должны понимать, что сервер, который содержит только код не имеет средств познания (предварительное условие для проверки) свое собственное имя на сеть. Он должен взаимодействовать с компонентом, который поставляет ему свое имя. Это может быть сделано с помощью:
Обычно его сделали через локальную (SAPI) конфигурационный файл. Обратите внимание, что вы правильно настроили его, например. в Apache ➫➫:
Для того, чтобы динамический виртуальный хост выглядел как обычный, нужно несколько вещей «подделать».
Наиболее важным является имя сервера, которое используется Apache для создания самореферентных URL-адресов и т. Д. Оно настроено с помощью директивы ServerName
, и оно доступно для CGI через переменную окружения SERVER_NAME
.
Фактическое значение, используемое во время выполнения, равно , управляемое параметром UseCanonicalName.
СUseCanonicalName Off
название сервера происходит от содержимого Host:
заголовка в запросе. СUseCanonicalName DNS
он исходит из обратного DNS-поиска IP-адреса виртуального хоста. Первая настройка используется для динамического виртуального хостинга на основе имен, а последняя используется для ** хостинга на базе IP.
Если Apache не может работать имя сервера, потому что нет Host:
заголовка или DNS поиск неудачен затем значение, заданное с ServerName
используется вместо этого.
Lol, я прочитал эту статью и на самом деле не ответил на мой вопрос. Какой из них использует pro devs? Если и есть. – Jeff
Iiiiinteresting, я никогда не знал, что SERVER_NAME использовал значения, предоставленные пользователем, по умолчанию в Apache. – Powerlord
@Jeff. Для серверов, на которых размещено более одного суб/домена, у вас есть только два варианта: '$ _SERVER ['SERVER_NAME']' и '$ _SERVER ['HTTP_HOST']' (помимо реализации другого пользовательского рукопожатия на основе пользовательский запрос). Про разработчики не доверяют вещам, которые они не понимают полностью. Таким образом, они либо имеют свою настройку SAPI ** совершенно правильно ** (в этом случае опция, которую они используют *, * даст правильный результат), либо они сделают белый список таким образом, что не имеет значения, какие значения дает SAPI. – Pacerier