Czy używanie $_SERVER['HTTP_HOST']
wszystkich łączy w witrynie jest „bezpieczne” bez martwienia się o ataki XSS, nawet jeśli są używane w formularzach?
Tak, jest bezpieczny w użyciu $_SERVER['HTTP_HOST']
(a nawet $_GET
i $_POST
), o ile zweryfikujesz je przed ich zaakceptowaniem. Oto, co robię dla bezpiecznych serwerów produkcyjnych:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$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!';
// ...
Zaletą $_SERVER['HTTP_HOST']
jest to, że jego zachowanie jest lepiej zdefiniowane niż $_SERVER['SERVER_NAME']
. Kontrast ➫➫ :
Zawartość hosta: nagłówek z bieżącego żądania, jeśli taki istnieje.
z:
Nazwa hosta serwera, pod którym wykonywany jest bieżący skrypt.
Używanie lepiej zdefiniowanego interfejsu, takiego jak, $_SERVER['HTTP_HOST']
oznacza, że więcej SAPI będzie go implementować przy użyciu niezawodnego, dobrze zdefiniowanego zachowania. (W przeciwieństwie do innych .) Jednak nadal jest całkowicie zależny od SAPI ➫➫ :
Nie ma gwarancji, że każdy serwer WWW dostarczy którekolwiek z tych [ $_SERVER
wpisów]; serwery mogą pomijać niektóre lub udostępniać inne niewymienione tutaj.
Aby zrozumieć, jak prawidłowo pobrać nazwę hosta, przede wszystkim musisz zrozumieć, że serwer, który zawiera tylko kod, nie ma możliwości poznania (warunku wstępnego weryfikacji) własnej nazwy w sieci. Musi łączyć się z komponentem, który nadaje mu własną nazwę. Można to zrobić za pomocą:
lokalny plik konfiguracyjny
lokalna baza danych
zakodowany na stałe kod źródłowy
żądanie zewnętrzne ( curl )
Host:
żądanie klienta / napastnika
itp
Zwykle odbywa się to za pośrednictwem lokalnego pliku konfiguracyjnego (SAPI). Zwróć uwagę, że skonfigurowałeś go poprawnie, np. W Apache ➫➫ :
Aby dynamiczny host wirtualny wyglądał jak normalny, trzeba „sfałszować” kilka rzeczy.
Najważniejsza jest nazwa serwera, z której Apache korzysta do generowania odwołujących się adresów URL itp. Jest konfigurowana za pomocą polecenia ServerName
dyrektywy i jest dostępna dla CGI poprzez SERVER_NAME
zmienną środowiskową.
Rzeczywista wartość używana w czasie wykonywania jest kontrolowana przez ustawienie UseCanonicalName.
Wraz UseCanonicalName Off
z nazwą serwera pochodzi z treści Host:
nagłówka w żądaniu. Dzięki UseCanonicalName DNS
temu pochodzi z odwrotnego wyszukiwania DNS adresu IP wirtualnego hosta. Pierwsze ustawienie jest używane do dynamicznego hostingu wirtualnego opartego na nazwach, a drugie do hostingu opartego na ** adresie IP.
Jeśli Apache nie może wypracować nazwę serwera, ponieważ nie ma Host:
nagłówka lub DNS Lookup nie wtedy wartość skonfigurowaną ze ServerName
jest używany zamiast.