Bonjour,

Pour un module de statistiques j'ai besoin de detecter le plus précisement possible (je sais que je ne pourrais pas en detecter un bon nombre) les IP des visiteurs. Ceci sert donc essentiellement aux utilisateurs derrière des proxy.

Dans la mesure ou ceci me semble assez compliqué à tester, je me tourne plutot vers une classe opensource.

Or j'ai regardé les fonctions de Openads qui permettent de faire ceci mais au vus du code je pense que sa a été codé à l'araché et du coup je ne suis pas certain que sa fonctionne correctement !

Est ce que quelqu'un a un bout de code, une classe ou une page qui peux faire ceci et surtout est ce qu'il peux atester que ce code fonctionne ?

Si sa peux servir, voici le code de Openads. A savoir que le code est etrange au niveau des lignes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
// Get last item from list
$IP = explode (',', $IP);
Puisque $IP ne contien a mon avis qu'une seule valeur.

De plus il est etrange que la fonction phpAds_reverseLookup(); ne soit pas appelée avant la fonction phpAds_proxyLookup();

Je suis egalement etonné par la suite des tests sur les éléments de la variable serveur qui peuvent potentiellement contenir une IP dans la mesure ou sa semble dépendre du type de proxi et qu'aucun test n'est effectué pour detecter le type de proxy ici !



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
 
// Check for proxyserver
phpAds_proxyLookup();
 
// Reverse lookup
phpAds_reverseLookup();
 
/*********************************************************/
/* Do the proxy lookup                                   */
/*********************************************************/
 
function phpAds_proxyLookup()
{
	global $phpAds_config;
 
	if (!$phpAds_config['proxy_lookup'])
		return;
 
	$proxy = false;
	if (isset ($_SERVER['HTTP_VIA']) && $_SERVER['HTTP_VIA'] != '') $proxy = true;
 
	if (isset ($_SERVER['REMOTE_HOST']))
	{
		if (is_int (strpos ($_SERVER['REMOTE_HOST'], 'proxy')))	$proxy = true;
		if (is_int (strpos ($_SERVER['REMOTE_HOST'], 'cache')))	$proxy = true;
		if (is_int (strpos ($_SERVER['REMOTE_HOST'], 'inktomi')))	$proxy = true;
	}
 
	if ($proxy)
	{
		$IP = '';
 
		// Overwrite host address if a suitable header is found
		if (isset($_SERVER['HTTP_FORWARDED']) && 		$_SERVER['HTTP_FORWARDED'] != '') 		 $IP = $_SERVER['HTTP_FORWARDED'];
		if (isset($_SERVER['HTTP_FORWARDED_FOR']) &&	$_SERVER['HTTP_FORWARDED_FOR'] != '') 	 $IP = $_SERVER['HTTP_FORWARDED_FOR'];
		if (isset($_SERVER['HTTP_X_FORWARDED']) &&		$_SERVER['HTTP_X_FORWARDED'] != '') 	 $IP = $_SERVER['HTTP_X_FORWARDED'];
		if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&	$_SERVER['HTTP_X_FORWARDED_FOR'] != '') $IP = $_SERVER['HTTP_X_FORWARDED_FOR'];
		if (isset($_SERVER['HTTP_CLIENT_IP']) &&		$_SERVER['HTTP_CLIENT_IP'] != '') 		 $IP = $_SERVER['HTTP_CLIENT_IP'];
 
		// Get last item from list
		$IP = explode (',', $IP);
		$IP = trim($IP[count($IP) - 1]);
 
		if ($IP && $IP != 'unknown' && !phpAds_PrivateSubnet($IP))
		{
			$_SERVER['REMOTE_ADDR'] = $IP;
			$_SERVER['REMOTE_HOST'] = '';
		}
	}
}
 
 
 
/*********************************************************/
/* Do the reverse lookup                                 */
/*********************************************************/
 
function phpAds_reverseLookup()
{
	global $phpAds_config;
 
	if (!isset($_SERVER['REMOTE_HOST']) || $_SERVER['REMOTE_HOST'] == '')
	{
		if ($phpAds_config['reverse_lookup'])
			$_SERVER['REMOTE_HOST'] = @gethostbyaddr ($_SERVER['REMOTE_ADDR']);
		else
			$_SERVER['REMOTE_HOST'] = $_SERVER['REMOTE_ADDR'];
	}
}
 
 
 
/*********************************************************/
/* Match an IP address against a subnet                  */
/*********************************************************/
 
function phpAds_matchSubnet($ip, $net, $mask)
{
	if (!is_integer($ip)) $ip = ip2long($ip);
	$net = ip2long($net);
 
	if (!$ip || !$net)
		return false;
 
	if (is_integer($mask))
	{
		// Netmask notation x.x.x.x/y used
 
		if ($mask > 32 || $mask <= 0)
			return false;
		elseif ($mask == 32)
			$mask = ~0;
		else
			$mask = ~((1 << (32 - $mask)) - 1);
	}
	elseif (!($mask = ip2long($mask)))
		return false;
 
	return ($ip & $mask) == ($net & $mask) ? true : false;
}
 
 
 
/*********************************************************/
/* Check if an IP address is not publicly routable       */
/*********************************************************/
 
function phpAds_PrivateSubnet($ip)
{
	$ip = ip2long($ip);
 
	if (!$ip) return false;
 
	return (phpAds_matchSubnet($ip, '10.0.0.0', 8) || 
		phpAds_matchSubnet($ip, '172.16.0.0', 12) ||
		phpAds_matchSubnet($ip, '192.168.0.0', 16) ||
		phpAds_matchSubnet($ip, '127.0.0.0', 24)
		);
}