Wie kann ich die IP-Adresse des Clients mit PHP ermitteln?
Ich möchte den Benutzer, der sich auf meiner Website angemeldet hat, über seine IP-Adresse aufzeichnen.
Wie kann ich die IP-Adresse des Clients mit PHP ermitteln?
Ich möchte den Benutzer, der sich auf meiner Website angemeldet hat, über seine IP-Adresse aufzeichnen.
<?php
/**
* Function to get the client ip address
*
* @return string The Ip address
*/
function getIp(): string {
if (! empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
}
if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
return $_SERVER['REMOTE_ADDR'] ?? '?';
}
Noch kleiner
/**
* Function to get the client ip address
*
* @return string The Ip address
*/
function getIp(): string {
return $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? '';
}
Ich bin überrascht, dass dies noch nicht erwähnt wurde. Es geht darum, die korrekten IP-Adressen der Websites zu erhalten, die hinter einer Infrastruktur wie CloudFlare eingebettet sind. Es wird Ihre IP-Adressen zu brechen, und geben sie alle den gleichen Wert. Glücklicherweise haben sie auch einige Server-Header zur Verfügung. Anstatt das neu zu schreiben, was bereits geschrieben wurde, schauen Sie hier für eine prägnantere Antwort, und ja, ich habe diesen Prozess vor langer Zeit auch durchlaufen. https://stackoverflow.com/a/14985633/1190051
In PHP sollte die letzte Option, um die öffentliche IP zu erhalten, immer sein $_SERVER["REMOTE_ADDR"]
aus viel zu vielen Sicherheitsgründen.
Hier ist ein Workaround, um die validierte IP-Adresse des Clients zu erhalten.
public static function getPublicIP() : string
{
$realIP = "Invalid IP Address";
$activeHeaders = [];
$headers = [
"HTTP_CLIENT_IP",
"HTTP_PRAGMA",
"HTTP_XONNECTION",
"HTTP_CACHE_INFO",
"HTTP_XPROXY",
"HTTP_PROXY",
"HTTP_PROXY_CONNECTION",
"HTTP_VIA",
"HTTP_X_COMING_FROM",
"HTTP_COMING_FROM",
"HTTP_X_FORWARDED_FOR",
"HTTP_X_FORWARDED",
"HTTP_X_CLUSTER_CLIENT_IP",
"HTTP_FORWARDED_FOR",
"HTTP_FORWARDED",
"ZHTTP_CACHE_CONTROL",
"REMOTE_ADDR" #this should be the last option
];
#Find active headers
foreach ($headers as $key)
{
if (array_key_exists($key, $_SERVER))
{
$activeHeaders[$key] = $_SERVER[$key];
}
}
#Reemove remote address since we got more options to choose from
if(count($activeHeaders) > 1)
{
unset($activeHeaders["REMOTE_ADDR"]);
}
#Pick a random item now that we have a secure way.
$realIP = $activeHeaders[array_rand($activeHeaders)];
#Validate the public IP
if (filter_var($realIP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
{
return $realIP;
}
return $realIP;
}
Wie Sie hier sehen können, ist $_SERVER["REMOTE_ADDR"] unsere letzte Option für die IP. Nachdem wir die IP erhalten haben, validieren wir sie auch, um Qualität und Sicherheit zu gewährleisten.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.