È "sicuro" da utilizzare $_SERVER['HTTP_HOST']
per tutti i collegamenti in un sito senza doversi preoccupare degli attacchi XSS, anche se utilizzati nei moduli?
Sì, è sicuro da usare $_SERVER['HTTP_HOST']
(e persino $_GET
e $_POST
) purché tu li verifichi prima di accettarli. Questo è ciò che faccio per i server di produzione sicuri:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$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!';
// ...
Il vantaggio di $_SERVER['HTTP_HOST']
è che il suo comportamento è più ben definito di $_SERVER['SERVER_NAME']
. Contrasto ➫➫ :
Contenuti dell'host: intestazione della richiesta corrente, se presente.
con:
Il nome dell'host del server con cui viene eseguito lo script corrente.
L'uso di un'interfaccia meglio definita come $_SERVER['HTTP_HOST']
significa che un numero maggiore di SAPI la implementerà utilizzando un comportamento ben definito e affidabile . (A differenza dell'altro .) Tuttavia, è ancora totalmente dipendente dalla SAPI ➫➫ :
Non vi è alcuna garanzia che ogni server Web fornirà una di queste [ $_SERVER
voci]; i server possono ometterne alcuni o fornire altri non elencati qui.
Per capire come recuperare correttamente il nome host, prima di tutto devi capire che un server che contiene solo codice non ha alcun mezzo per conoscere (prerequisito per la verifica) il proprio nome sulla rete. Deve interfacciarsi con un componente che gli fornisce il proprio nome. Questo può essere fatto tramite:
file di configurazione locale
database locale
codice sorgente hardcoded
richiesta esterna ( arricciatura )
client / dell'attaccante Host:
richiesta
eccetera
Di solito viene eseguito tramite il file di configurazione locale (SAPI). Nota che l'hai configurato correttamente, ad es. In Apache ➫➫ :
È necessario "falsificare" un paio di cose per rendere l'host virtuale dinamico simile a un normale.
Il più importante è il nome del server utilizzato da Apache per generare URL autoreferenziali, ecc. È configurato con la ServerName
direttiva ed è disponibile per i CGI tramite la SERVER_NAME
variabile di ambiente.
Il valore effettivo utilizzato in fase di esecuzione è controllato dall'impostazione UseCanonicalName.
Con UseCanonicalName Off
il nome del server deriva dal contenuto Host:
dell'intestazione nella richiesta. Con UseCanonicalName DNS
esso proviene da una ricerca DNS inversa dell'indirizzo IP dell'host virtuale. La prima impostazione viene utilizzata per l'hosting virtuale dinamico basato sul nome e la seconda per l'hosting basato su IP **.
Se Apache non può lavorare fuori il nome del server, perché non v'è alcuna Host:
intestazione o il DNS lookup fallisce poi il valore configurato con ServerName
viene usato al posto.