Gehe zu deutscher Webseite

ViaThinkSoft CodeLib

This article is in:
CodeLibProgramming aidsPHP

IP Adressen werden gerne bei Formulareingaben mitgeschrieben, um Spammer verfolgen zu können. Desweiteren ist eine eindeutige IP-Adresse wichtig für Besucherzähler mit Reloadsperren. Mit der globalen Variable $_SERVER['remote_addr'] wird meistens die IP-Adresse des Besuchers erfasst. Dies ist jedoch unsicher, da sie bei der Verwendung von Proxies auf den Proxyserver anstelle des Besuchers zeigt. Dann wäre eine Strafverfolgung nicht mehr sicher genug. Und bei Proxies, die die IP-Adresse dynamisch wechseln (z.B. AOL) würde ein Besucherzähler bei jedem Klick in die höhe Springen. Proxies fügen in der Regel die Kopfzeilen "HTTP_X_FORWARDED_FOR" und/oder "HTTP_CLIENT_IP" bei jeder HTTP-Anfrage hinzu, die eigentlich den Benutzer idendifizieren sollen. Doch Vorsicht: Diese Angaben können durch den Proxy unter Umständen manipuliert werden.

Folgender Code behebt das Problem:

<?php

function get_real_ip()
{
  
$client_ip = (isset($_SERVER['HTTP_CLIENT_IP'])) ? $_SERVER['HTTP_CLIENT_IP'] : '';
  
$x_forwarded_for = (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : '';
  
$remote_addr = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : '';

  if (!empty(
$client_ip))
  {
    
$ip_expl explode('.',$client_ip);
    
$referer explode('.',$remote_addr);
    if(
$referer[0] != $ip_expl[0])
    {
      
$ip=array_reverse($ip_expl);
      
$return=implode('.',$ip);
    }
    else
    {
      
$return $client_ip;
    }
  }
  else if (!empty(
$x_forwarded_for))
  {
    if(
strstr($x_forwarded_for,','))
    {
      
$ip_expl explode(',',$x_forwarded_for);
      
$return end($ip_expl);
    }
    else
    {
      
$return $x_forwarded_for;
    }
  }
  else
  {
    
$return $remote_addr;
  }
  unset (
$client_ip$x_forwarded_for$remote_addr$ip_expl);
  return 
$return;
}

?>

Quelle: http://lists.phpbar.de/pipermail/php/Week-of-Mon-20040322/007749.html
Daniel Marschall
ViaThinkSoft Co-Founder