PHP
Hoe het IP-adres van de client te detecteren
Zoeken…
Correct gebruik van HTTP_X_FORWARDED_FOR
In het licht van de nieuwste httpoxy- kwetsbaarheden is er nog een variabele die op grote schaal wordt misbruikt.
HTTP_X_FORWARDED_FOR
wordt vaak gebruikt om het IP-adres van de client te detecteren, maar zonder aanvullende controles kan dit leiden tot beveiligingsproblemen, vooral wanneer dit IP-adres later wordt gebruikt voor authenticatie of in SQL-query's zonder sanering.
De meeste beschikbare codevoorbeelden negeren het feit dat HTTP_X_FORWARDED_FOR
daadwerkelijk kan worden beschouwd als informatie die door de client zelf wordt verstrekt en daarom geen betrouwbare bron is om het IP-adres van de client te detecteren. Sommige voorbeelden voegen een waarschuwing toe over mogelijk misbruik, maar missen nog een extra controle in de code zelf.
Dus hier is een voorbeeld van een functie geschreven in PHP, hoe een IP-adres van een client te detecteren, als u weet dat de client mogelijk achter een proxy staat en u weet dat deze proxy kan worden vertrouwd. Als u geen vertrouwde proxy's REMOTE_ADDR
, kunt u gewoon 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();