Wird der Wert einer Menge $ _SERVER ['HTTP_CLIENT_IP'] eine leere Zeichenfolge sein?

7

Ich habe ein einfaches Skript, das die IP-Adresse des Benutzers bestimmt:

%Vor%

Jetzt irgendwo im Internet habe ich jemanden gesehen, der dieses Skript benutzt:

%Vor%

Ich habe mich gefragt, ob meine Implementierung unterbrochen ist. Muss ich überprüfen, ob der Wert von $_SERVER['HTTP_CLIENT_IP'] , $_SERVER['HTTP_X_FORWARDED_FOR'] oder $_SERVER['REMOTE_ADDR'] leer ist? Oder ist das überhaupt nicht nötig?

    
Pacerier 01.10.2011, 21:50
quelle

4 Antworten

12

Wenn der Grund, warum Sie die IP-Adresse des Clients herausfinden wollen, wirklich wichtig ist, schrauben Sie all diese Sachen zusammen.

Jeder dieser Header-Werte kann frei gefälscht werden.

REMOTE_ADDR ist die einzige wirklich zuverlässige Information, da sie von Ihrem Webserver, der die Anfrage bearbeitet, an Sie übermittelt wird. Es kann theoretisch auch verfälscht werden , aber das ist viel, viel schwieriger als das Spoofing eines Header-Wertes und eine ganz andere Klasse des Angriffs.

Es gibt Ausnahmen in sehr, sehr spezifischen Hosting-Umgebungen hinter Reverse-Proxies. In diesen Fällen kann die Person, die diesen Proxy verwaltet, feststellen, für welchen Headerwert Sie testen müssen.

    
Pekka 웃 01.10.2011, 22:04
quelle
8

Von Kohanas Request-Klasse:

%Vor%

Das ist so gut wie es geht. Bitte beachten Sie das Array Request::$trusted_proxies und dass Ihre $ip var in diesem Fall Request::$client_ip ist.

    
Kemo 01.10.2011 22:00
quelle
7

Überprüfen Sie keine HTTP_* -Header für die Client-IP, es sei denn, Sie wissen genau, dass Ihre Anwendung hinter einem Reverse-Proxy konfiguriert ist. Wenn Sie den Werten dieser Header bedingungslos vertrauen, können Benutzer ihre IP-Adresse fälschen.

Das einzige $_SERVER -Feld, das einen zuverlässigen Wert enthält, ist REMOTE_ADDR .

    
duskwuff 01.10.2011 22:05
quelle
1

Die beiden Dinge sind praktisch identisch. In dem Skript, das Sie gefunden haben, überprüft der Autor gerade, ob das Element im Array gesetzt ist, bevor es überprüft, dass es nicht leer ist.

In Bezug auf die Verwendung der empty() -Funktion anstelle des Vergleichs, überprüfen Sie Ссылка . Da es sich um eine Variable handelt, die von der Umgebung und nicht von einer Benutzereingabe festgelegt wird, spielt es keine Rolle, welche der beiden Optionen Sie auswählen. Dein Skript sollte also vollkommen in Ordnung sein.

    
klaustopher 01.10.2011 21:55
quelle

Tags und Links