Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/03/2007, 15h19   #1
Invité de passage
 
Inscription : décembre 2004
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 3
Points : 0
Points : 0
Par défaut [Cookies] IP réelle du visiteur

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 :
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 :
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)
		);
}
Herman_t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 18h51   #2
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
Les adresses IP ne sont pas un bon moyen pour permettre une authentification (ou un enregistrement), facilement usurpable, dynamique...

Une personnes qui veut nuire à ton système y arrivera.

Pour ce qui est du script, il est assez simpliste, il contrôle juste si dans le nom d'hôte figure PROXY CACHE ou INKTOMI et si les le serveurs reçois des HTTP_VIA.

Si tu veux faire des teste le niveau d'anonymat d'un proxy:
http://www.ipmaster.org/proxyjudge.html

tu trouvera peut être ton bonheur en téléchargement le code source du système de teste d'anonymat d'un proxy
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 19h09   #3
Invité de passage
 
Inscription : décembre 2004
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 3
Points : 0
Points : 0
Oui je sais que ce n'est pas une bonne solution mais dans le cas present c'est la seule solution. Pour faire des stats sur les utilisateurs, on a soit l'ip soit les cookies. Et vu le nombre de personnes qui les désactivent....

Le lien donné donne un script PHP de 3 lignes qui affiche les variables $_SERVER !
Herman_t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 19h20   #4
Membre confirmé
 
Inscription : décembre 2006
Messages : 297
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 297
Points : 248
Points : 248
excuse moi, c'est du Perl.

Si tu veux contrôler, ça doit être possible alors avec un système de blacklist, qui doit être mise à jours (pour être pleinement efficace).
Tu télécharges une liste de proxy que tu bloques ou filtre les personnes qui utilisent les adresses IP blacklister

http://www.proxy4free.com/page1.html
http://www.publicproxyservers.com/page1.html
...

Personnellement, je ne pense pas qu'en PHP se soit tellement réalisable, tout simplement parce qu'une analyse (comparaison) de plusieurs centaines de millier d'adresse pour chaque visiteurs, ça risque d'être lourd et lent.

Je te conseil un IPTABLES qui bloquera tout simple.
un exemple: http://www.trustonme.net/didactels/228.html
juJuv51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 09h34   #5
Invité de passage
 
Inscription : décembre 2004
Messages : 3
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 3
Points : 0
Points : 0
Ok merci.

Mais en fait je ne veux bloquer personne, je veux detecter le maximum d'IP. Donc assayer de detecter les IP des utilisateurs derriere les proxy quand ceci est possible.

Je ne veux rien faire de plus.

Mon probleme est surtout pour coder la fonction qui fait ceci en fonction de tests à effectuer pour voir si un proxy est présent et le cas échéant pour recuperer la bonne ip dans les variables serveurs.
Herman_t est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h10.


 
 
 
 
Partenaires

Hébergement Web