PHP
Come rilevare l'indirizzo IP del client
Ricerca…
Uso corretto di HTTP_X_FORWARDED_FOR
Alla luce delle ultime vulnerabilità di httpoxy , c'è un'altra variabile, che è ampiamente usata impropriamente.
HTTP_X_FORWARDED_FOR
viene spesso utilizzato per rilevare l'indirizzo IP del client, ma senza ulteriori verifiche, questo può portare a problemi di sicurezza, soprattutto quando questo IP viene in seguito utilizzato per l'autenticazione o nelle query SQL senza sterilizzazione.
La maggior parte degli esempi di codice disponibili ignorano il fatto che HTTP_X_FORWARDED_FOR
può effettivamente essere considerato come un'informazione fornita dal client stesso e pertanto non è una fonte affidabile per rilevare l'indirizzo IP dei client. Alcuni esempi aggiungono un avvertimento circa il possibile uso improprio, ma mancano ancora ulteriori controlli nel codice stesso.
Quindi ecco un esempio di funzione scritta in PHP, come rilevare un indirizzo IP del client, se si sa che il client potrebbe essere dietro un proxy e si sa che questo proxy può essere considerato affidabile. Se non conosci alcun proxy fidato, puoi semplicemente utilizzare REMOTE_ADDR
function get_client_ip()
{
// Nothing to do without any reliable information
if (!isset($_SERVER['REMOTE_ADDR'])) {
return NULL;
}
// Header that is used by the trusted proxy to refer to
// the original IP
$proxy_header = "HTTP_X_FORWARDED_FOR";
// List of all the proxies that are known to handle 'proxy_header'
// in known, safe manner
$trusted_proxies = array("2001:db8::1", "192.168.50.1");
if (in_array($_SERVER['REMOTE_ADDR'], $trusted_proxies)) {
// Get IP of the client behind trusted proxy
if (array_key_exists($proxy_header, $_SERVER)) {
// Header can contain multiple IP-s of proxies that are passed through.
// Only the IP added by the last proxy (last IP in the list) can be trusted.
$client_ip = trim(end(explode(",", $_SERVER[$proxy_header])));
// Validate just in case
if (filter_var($client_ip, FILTER_VALIDATE_IP)) {
return $client_ip;
} else {
// Validation failed - beat the guy who configured the proxy or
// the guy who created the trusted proxy list?
// TODO: some error handling to notify about the need of punishment
}
}
}
// In all other cases, REMOTE_ADDR is the ONLY IP we can trust.
return $_SERVER['REMOTE_ADDR'];
}
print get_client_ip();