Ist es "sicher", $_SERVER['HTTP_HOST']
alle Links auf einer Site zu verwenden, ohne sich über XSS-Angriffe Gedanken machen zu müssen, selbst wenn sie in Formularen verwendet werden?
Ja, es ist sicher zu verwenden $_SERVER['HTTP_HOST']
(und sogar $_GET
und $_POST
) , solange Sie sie überprüfen, bevor Sie sie akzeptieren. Folgendes mache ich für sichere Produktionsserver:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$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!';
// ...
Der Vorteil von $_SERVER['HTTP_HOST']
ist, dass sein Verhalten klarer definiert ist als $_SERVER['SERVER_NAME']
. Kontrast ➫➫ :
Inhalt des Hosts: Header aus der aktuellen Anforderung, falls vorhanden.
mit:
Der Name des Serverhosts, unter dem das aktuelle Skript ausgeführt wird.
Die Verwendung einer besser definierten Schnittstelle wie $_SERVER['HTTP_HOST']
bedeutet, dass mehr SAPIs diese mithilfe eines zuverlässigen, genau definierten Verhaltens implementieren . (Im Gegensatz zu den anderen .) Es ist jedoch immer noch vollständig SAPI-abhängig ➫➫ :
Es gibt keine Garantie dafür, dass jeder Webserver diese [ $_SERVER
Einträge] bereitstellt . Server können einige weglassen oder andere bereitstellen, die hier nicht aufgeführt sind.
Um zu verstehen, wie der Hostname ordnungsgemäß abgerufen wird, müssen Sie in erster Linie verstehen, dass ein Server, der nur Code enthält, keine Möglichkeit hat, seinen eigenen Namen im Netzwerk zu kennen (Voraussetzung für die Überprüfung) . Es muss mit einer Komponente verbunden sein, die ihm einen eigenen Namen gibt. Dies kann erfolgen über:
Normalerweise erfolgt dies über die lokale Konfigurationsdatei (SAPI). Beachten Sie, dass Sie es richtig konfiguriert haben, z. B. in Apache ➫➫ :
Einige Dinge müssen gefälscht werden, damit der dynamische virtuelle Host wie ein normaler aussieht.
Der wichtigste ist der Servername, der von Apache zum Generieren von selbstreferenziellen URLs usw. verwendet wird. Er wird mit der ServerName
Direktive konfiguriert und steht CGIs über die SERVER_NAME
Umgebungsvariable zur Verfügung.
Der zur Laufzeit verwendete tatsächliche Wert wird durch die Einstellung UseCanonicalName gesteuert .
Mit UseCanonicalName Off
dem Server - Name kommt von dem Inhalt des Host:
Header in der Anfrage. Damit UseCanonicalName DNS
kommt eine Reverse-DNS-Suche der IP-Adresse des virtuellen Hosts zustande. Die erstere Einstellung wird für namenbasiertes dynamisches virtuelles Hosting verwendet, und die letztere Einstellung wird für ** IP-basiertes Hosting verwendet.
Wenn Apache kann nicht den Namen des Servers arbeiten, weil es keine Host:
Header oder der DNS - Lookup fehlschlägt dann den Wert konfiguriert ServerName
stattdessen verwendet wird.